Ich versuche, eine alte Website zu archivieren und in den statisch gehosteten Amazon S3-Bereich hochzuladen.
Ich konnte den Inhalt wget
mithilfe des folgenden Befehls abrufen:
wget --mirror --no-parent --html-extension --page-requisites http://original.com
Dann könnte ich alle Links zu ihrer neuen URL ersetzen durch:
ag -l original\.com -0 | xargs -0 sed -i '' \
's|original.com|old.original.com|g'
Anschließend habe ich die Website mithilfe von auf Amazon S3 hochgeladen s3cmd sync
.
Mein einziges Problem ist jetzt, dass bei allen „Cache-busted“-Assets der Zugriff auf Amazon verweigert wird. Das Problem ist, dass ich wget
die Dateien mit Abfrageparametern im Dateinamen erhalten habe und sie umbenennen muss.
Daher möchte ich Dateien in allen Unterordnern rekursiv umbenennen, etwa:
style.css?ver=4.2.5.css
wird umbenannt instyle.css
Wie kann ich das in Mac OS X mit Bash 3.2 machen?
Antwort1
Das sollte funktionieren:
find . -maxdepth 1 -type f -name '*\?*' |\
while read FILENAME
do
IFS='?'
SPLIT_FILENAME=(${FILENAME})
unset IFS
echo mv "${FILENAME}" "${SPLIT_FILENAME}"
# mv "${FILENAME}" "${SPLIT_FILENAME}"
done
Das find .
zeigt an, dass alle Aktionen im aktuellen Verzeichnis sowie in den Unterverzeichnissen stattfinden. Sie können das gerne ändern, .
sodass es der vollständige/tatsächliche Dateipfad der Aktion ist. Das -name '*\?*'
sucht nach Dateien mit einem Fragezeichen ( ?
) im Namen.
Diese erste/Demoversion hat auch einen -maxdepth
Wert von „1“, damit der Prozess auf Ihrem Dateisystem nicht außer Kontrolle gerät, und sie verwendet eine echo
Version des Befehls, um Ihnen zu zeigen, was er tun würde, bevor Sie ihn tatsächlich ausführen.
-maxdepth 1
Wenn Sie das ausführen und die Ausgabe gut aussieht, können Sie es gerne in etwa wie folgt anpassen oder es sogar vollständig entfernen und dann die Zeile -maxdepth 9
auskommentieren bzw. die Kommentierung der Zeile aufheben, sodass sie folgendermaßen aussieht:echo
mv
find . -type f -name '*\?*' |\
while read FILENAME
do
IFS='?'
SPLIT_FILENAME=(${FILENAME})
unset IFS
# echo mv "${FILENAME}" "${SPLIT_FILENAME}"
mv "${FILENAME}" "${SPLIT_FILENAME}"
done
Unter Verwendung Ihres Beispiels der Testdatei style.css?ver=4.2.5.css
habe ich beim Ausführen dieses Skripts auf meinem Mac OS X 10.9.5-System (Mavericks) diese Ausgabe erhalten:
mv ./style.css?ver=4.2.5.css ./style.css
Sieht für mich nach einem guten Wechsel aus. Habe es mit dem echten mv
Befehl ausgeführt und die Datei wurde erfolgreich in umbenannt style.css
. Dies würde auch mit Dateien funktionieren, die Leerzeichen enthalten, wie z. B. Testdateien wie this is my style.css?ver=4.2.5.css
und my style.css?ver=4.2.5.css
.
Antwort2
?
Dies würde unter Mac OS X funktionieren, vorausgesetzt , die URL/der ursprüngliche Dateiname enthält nur eine Zeichenfolge :
find . -name "*\?*" -exec sh -c 'var="{}" ; mv "{}" "${var%\?*}"' \;
Als Referenz: Dies würde auch auf Linux-Systemen – oder jedem anderen System – funktionieren, auf dem das rename
Tool installiert ist:
find . -name "*\?*" -exec rename "s/\?.*//" "{}" \;
Antwort3
Ich werde zur Demonstration Echo verwenden.
# echo 'style.css?ver=4.2.5.css' | cut -d? -f2-9999
ver=4.2.5.css
Rekursion:
cd <yourdir>
for f in *; do
newf=$( echo $f | cut -d? -f2-9999 )
mv $f $newf
done
Annahmen: <yourdir>
enthält nur Dateien, die Sie ändern möchten. Wenn nicht, ändern Sie den for f in *
Glob entsprechend. Sie sollten den endgültigen Befehl zuerst mit echo testen, d. h. ersetzen Sie ihn mv $f $newf
durch echo $f $nf
und stellen Sie sicher, dass er das gewünschte Ergebnis liefert.