it-swarm.com.de

Wie benenne ich mehrere Dateien um, indem ich die Zeichenfolge im Dateinamen ersetze? Diese Zeichenfolge enthält ein "#"

https://serverfault.com/questions/70939/how-to-replace-a-text-string-in-multiple-files-in-linux

https://serverfault.com/questions/228733/how-to-rename-multiple-files-by-replacing-Word-in-file-name

https://serverfault.com/questions/212153/replace-string-in-files-with-certain-file-extension

https://serverfault.com/questions/33158/searching-a-number-of-files-for-a-string-in-linux

Diese genannten Artikel haben alle meine Frage beantwortet. Jedoch arbeitet keiner von ihnen für mich. Ich vermute, das liegt daran, dass die Zeichenfolge, die ich ersetzen möchte, ein # enthält. Gibt es eine spezielle Möglichkeit, dies zu beheben?

Ich habe eine Bilddatei, deren é während einer Site-Migration durch # U00a9 ersetzt wurde. Diese sehen so aus:

Lucky-#U00a9NBC-80x60.jpg
Lucky-#U00a9NBC-125x125.jpg
Lucky-#U00a9NBC-150x150.jpg
Lucky-#U00a9NBC-250x250.jpg
Lucky-#U00a9NBC-282x232.jpg
Lucky-#U00a9NBC-300x150.jpg
Lucky-#U00a9NBC-300x200.jpg
Lucky-#U00a9NBC-300x250.jpg
Lucky-#U00a9NBC-360x240.jpg
Lucky-#U00a9NBC-400x250.jpg
Lucky-#U00a9NBC-430x270.jpg
Lucky-#U00a9NBC-480x240.jpg
Lucky-#U00a9NBC-600x240.jpg
Lucky-#U00a9NBC-600x250.jpg
Lucky-#U00a9NBC.jpg

und ich möchte es in so etwas ändern:

Lucky-safeNBC-80x60.jpg
Lucky-safeNBC-125x125.jpg
Lucky-safeNBC-150x150.jpg
Lucky-safeNBC-250x250.jpg
Lucky-safeNBC-282x232.jpg
Lucky-safeNBC-300x150.jpg
Lucky-safeNBC-300x200.jpg
Lucky-safeNBC-300x250.jpg
Lucky-safeNBC-360x240.jpg
Lucky-safeNBC-400x250.jpg
Lucky-safeNBC-430x270.jpg
Lucky-safeNBC-480x240.jpg
Lucky-safeNBC-600x240.jpg
Lucky-safeNBC-600x250.jpg
Lucky-safeNBC.jpg

AKTUALISIEREN:

Diese Beispiele beginnen alle mit "LU00a9ucky", aber hier sind viele Bilder mit unterschiedlichen Namen. Ich ziele einfach auf den Teil "# U00a9" der Zeichenfolge, um ihn durch "safe" zu ersetzen.

Dies ist nicht schwer. Stellen Sie einfach sicher, dass Sie dem Oktothorpe (#) im Namen entkommen, indem Sie einen umgekehrten Schrägstrich (\) voranstellen.

find . -type f -name 'Lucky-*' | while read FILE ; do
    newfile="$(echo ${FILE} |sed -e 's/\\#U00a9/safe/')" ;
    mv "${FILE}" "${newfile}" ;
done 
24
DTK

Um # Durch somethingelse für Dateinamen im aktuellen Verzeichnis (nicht rekursiv) zu ersetzen, können Sie das Dienstprogramm GNU-Umbenennung verwenden:

rename  's/#/somethingelse/' *

Zeichen wie - Müssen mit einem \ Enthalten werden.

Für Ihren Fall möchten Sie verwenden

rename 's/#U00a9/safe/g' *

Beachten Sie, dass Sie die endgültige Eingabe an diese Auswahl anpassen müssen, wenn Sie nur eine bestimmte Auswahl von Dateien bearbeiten möchten, z. B. nur *.jpg.

rename 's/#U00a9/safe/g' *.jpg

Verwenden Sie das Flag -n, Um einen Test durchzuführen, bevor Sie Dateinamen tatsächlich ändern:

demo/> ls                               
Lucky-#U00a9NBC-125x125.jpg  
Lucky-#U00a9NBC-150x150.jpg 

demo/> rename -n 's/#U00a9/safe/g' *.jpg
rename(Lucky-#U00a9NBC-125x125.jpg, Lucky-safeNBC-125x125.jpg)
rename(Lucky-#U00a9NBC-150x150.jpg, Lucky-safeNBC-150x150.jpg)

Unter OS X kann GNU Rename kann mit Homebrew : brew install rename Installiert werden.

83
KrisWebDev

suchen Sie die Liste der Dateien und ersetzen Sie das Schlüsselwort. Unten ist ein Beispiel

find . -name '*jpg' -exec bash -c ' mv $0 ${0/\#U00a9NBC/safeNBC}' {} \;
28
Sujit Dhamale

Fliehen # Verwenden Sie in der Shell nur einfache Anführungszeichen ('#'), Anführungszeichen ("#") oder Backslash (\#).

In Ihrem Fall ist es am einfachsten, den Befehl rename zu verwenden (falls verfügbar):

rename '#U00a9' safe *.jpg
20
mik

ich bin mir nicht sicher, wie ich es in sed machen soll, aber du kannst es in einer Bash-Shell versuchen:

for f in Lucky-#U00a9NBC-*.jpg; do mv -v "$f" "${f/#U00a9/safe}"; done;

erläuterung:

  1. durchläuft alle Dateinamen, die mit dem Glob übereinstimmen (Lucky- # U00a9NBC - *. jpg)
  2. benennt die Datei mit dem Befehl move (mv) um
  3. verwendet die native Bash-Parameterersetzung $ {var/Pattern/Replacement}, um den neuen Namen zu erstellen ("$ {f/# U00a9/safe}")

Weitere Informationen zur Parametersubstitution (die IMO stark unterlastet ist): http://www.tldp.org/LDP/abs/html/parameter-substitution.html

12
Gregory Patmore

Die obigen Beispiele funktionierten nicht auf meinem System (CentOS 5.6), daher habe ich einen (möglicherweise systemspezifischeren) Befehl gefunden, der funktioniert (Hinweis: Es muss '#' mit \ In der Befehlszeile maskiert werden):

rename \#U00a9 safe *.jpg

[Außerdem: Ich habe noch nicht genug Ruf, um einen Kommentar abzugeben. Als Antwort auf Nikhils Frage bezüglich der Verwendung von /g In rename 's/old_string/new_string/g' (In den Kommentaren für eine andere Antwort oben gestellt):

Verwenden Sie den Modifikator g, um eine 'globale' Ersetzung durchzuführen (dh um old_string so oft durch old_string zu ersetzen, wie old_string auftritt). Dies sollte in meiner Antwort nicht erforderlich sein, da rename auf alle mit * Angegebenen Dateien angewendet wird. Eine kurze Erklärung dieses und anderer Modifikatoren finden Sie unter https://www.computerhope.com/unix/rename.htm .]

1
Ezra Citron

Hier ist die DTK-Lösung in der wiederverwendbaren Bash-Funktion:

function renameFilesRecursively () {

  SEARCH_PATH="$1"
  SEARCH="$2"
  REPLACE="$3"

  find ${SEARCH_PATH} -type f -name "*${SEARCH}*" | while read FILENAME ; do
      NEW_FILENAME="$(echo ${FILENAME} | sed -e "s/${SEARCH}/${REPLACE}/g")";
      mv "${FILENAME}" "${NEW_FILENAME}";
  done

}

So können Sie es verwenden:

renameFilesRecursively /home/user/my-files Apple orange
0
Slava Fomin II

Tatsächlich hat rename eine Option genau für die Option --subst oder -s Zusamenfassend. Die Regex-Syntax muss nicht verwendet werden.

rename -s '#U00a9' 'safe' *

Wenn Sie mehrere Vorkommen ersetzen/ersetzen möchten, verwenden Sie --subst-all oder -S.

Übrigens wollte ich nur einen String durch nichts ersetzen (aus dem Dateinamen entfernen) ... nun, wir haben auch eine Option dafür -d/--delete und -D/--delete-all:

rename -d '#U00a9' *
0
lapin

Folge diesen Schritten

ls Lucky-#U00a9NBC*.jpg 

Zeigt alle jpg Dateinamen mit Lucky-#U00a9NBC* An.

rename 's/Lucky-#U00a9NBC/Lucky-safeNBC/' *.jpg

Nach Ausführung dieses Befehls wird jeder Lucky-#U00a9NBC Durch Lucky-safeNBC Ersetzt.

 ls Lucky-safeNBC*.jpg

Sie können sehen, dass alle Dateien umbenannt werden

0
Kalana

Ich würde eher sagen, dass #U00a9 Hier für das Zeichen U + 00A9 stehen soll (©).

Wenn Sie es wieder auf © Zurücksetzen möchten, das im Zeichensatz des Gebietsschemas codiert ist, können Sie die Perl -Varianten von rename verwenden (manchmal auch prename genannt). ::

rename '
  use Encode::Locale;
  use Encode;
  s/#U([0-9a-f]{4})/chr hex $1/gie;
  $_ = encode(locale_fs => $_)' ./*'#'[uU]*
0