Umbenennen von über „wget --mirror“ in Bash abgerufenen Dateien vor dem Hochladen in einen statisch gehosteten Amazon S3-Bereich

Umbenennen von über „wget --mirror“ in Bash abgerufenen Dateien vor dem Hochladen in einen statisch gehosteten Amazon S3-Bereich

Ich versuche, eine alte Website zu archivieren und in den statisch gehosteten Amazon S3-Bereich hochzuladen.

Ich konnte den Inhalt wgetmithilfe 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 wgetdie 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.csswird 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 -maxdepthWert von „1“, damit der Prozess auf Ihrem Dateisystem nicht außer Kontrolle gerät, und sie verwendet eine echoVersion des Befehls, um Ihnen zu zeigen, was er tun würde, bevor Sie ihn tatsächlich ausführen.

-maxdepth 1Wenn 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 9auskommentieren bzw. die Kommentierung der Zeile aufheben, sodass sie folgendermaßen aussieht:echomv

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.csshabe 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 mvBefehl 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.cssund 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 renameTool 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 $newfdurch echo $f $nfund stellen Sie sicher, dass er das gewünschte Ergebnis liefert.

verwandte Informationen