Wie kann ich Dateien umbenennen und Zeichen ersetzen?

11

Ich habe eine Gruppe von Dateien, die haben : (Doppelpunkt) im Namen. Ich muss das ersetzen : mit - (Strich).

Gibt es eine einfache Möglichkeit, dies in einem Skript zu tun?

Beispieldateiname: 2013-10-11:11:52:08_055456663_045585_.txt

Ducky
quelle

Antworten:

16

Ein einfacher 1-Liner sollte reichen (unter der Annahme von Posix sh -kompatible Shell):

for f in *:*; do mv -v "$f" $(echo "$f" | tr ':' '-'); done

Erläuterung:

  • for ... in ...; do ...; done ist ein Schleife

  • *:* Streichhölzer alle dateien und verzeichnisse im aktuellen verzeichnis die haben : in ihrem Namen

  • f wird wiederum jedem solchen Dateinamen in der Schleife zugewiesen

  • mv benennt sein erstes Argument in das zweite um; -v (ausführlich) fordert es auf, seine Aufgaben zu drucken; Diese Option ist GNU-Utils spezifisch, daher ist es unter Linux verfügbar, jedoch nicht unter Solaris

  • $(...) Führt den Code in einer Sub-Shell aus und ersetzt die Ausgabe

  • echo Gibt das Argument in der Standardausgabe aus

  • tr Liest die Standardausgabe und übersetzt die Zeichen entsprechend der mitgelieferten Karte

Wenn Sie verwenden Bash , Sie können vermeiden, eine zusätzliche Schale zu laichen ( $() ) mit Teilprozessen ( tr ) Durch Ersetzen $(...) mit ${f//:/-}.

sds
quelle
+1 für eine einfache funktionierende Antwort, obwohl es ein bisschen mehr Erklärung gebrauchen könnte. Z.B. das for f in ... loop ist eine Schleife, die über alle Dateien im aktuellen Verzeichnis iteriert, in denen die Dateien übereinstimmen müssen *:*. (Was passiert mit dirs, die übereinstimmen?). Der Befehl move ist ein move oldname newname, bei dem der neue Name durch Ausführen einer Shell mit generiert wird $( subshell here ). Was tr macht, ...
Hennes
@Hennes: das ist Superuser - Muss ich wirklich auf diese Art von Details eingehen? Na gut, hier gehts ...
sds
Nein. Wenn es einen echten Bedarf gäbe, hätte ich nicht +1 gegeben. Und ich verstehe, was es tut. Ich denke, es ist schön für viele andere Leser.
Hennes
2
Sie können das ersetzen $(echo "$f" | tr ':' '-') mit "${f//:/-}" und vermeiden Sie den Aufruf von Subshell, Pipe und externem Programm. Ich denke, das ist ein Bashismus, aber eh. Siehe hier .
evilsoup
@ Evilsoup In der Tat; Bei kleinen Datenmengen macht das keinen großen Unterschied (und man könnte die Lesbarkeit fördern), aber Sie wären überrascht, wie schnell sich so etwas summiert. Ich habe mich in letzter Zeit daran gewöhnt. Umschreiben eines Skripts, sodass zwei einfache Befehle zum Massieren von Zeichenfolgen nicht mehr erforderlich waren leicht Verkürzung der Ausführungszeit um 90% oder mehr, was bei einem großen Datensatz zu mehreren Minuten Laufzeit im Wallclock-Format führte.
a CVn
6

Wie in einem anderen Beitrag von mir angegeben rename Werkzeug könnte den Trick für Sie tun. Sie müssen nur tippen rename s/:/-/ <files to rename> Dies ersetzt jeden Doppelpunkt durch einen Bindestrich in allen Dateien, die Sie am Ende benennen, d.h. e. 2013-10-*

Hier ist der link zu meinem anderen post

noggerl
quelle
1

Ich bin mir sicher, dass ein UNIX-Profi dies mit Bash tun könnte, aber hier ist meine schnelle und schmutzige Version mit Ruby.

path_to_files = "/home/username/wrongnames/"
filenames = `ls #{path_to_files}`.split
filenames.each do |fn|
  `mv #{path_to_files + fn} #{path_to_files + fn.gsub(/:/, "-")}`
end

Setzen Sie path_to_files auf den Pfad zu Ihren falsch benannten Dateien. Speichern Sie den obigen Code in einer Datei namens rename.rb dann:

username@machinename$ ruby rename.rb
shupru
quelle
@sds bietet eine viel bessere Antwort. Soll ich meine Antwort löschen? Ich bin neu in Stackoverflow.
shupru
1
Nein; es hat immer noch einen signifikanten Wert. :)
Blacklight Shining
2
Diese Antwort hat jedoch einige große Nachteile könnte relevant sein und sind definitiv wissenswert. (Es könnte immer noch nützlich sein, aber Vorbehalt Emptor und das alles.) In erster Linie sieht es so aus es wird schlecht brechen, wenn es auf Dateinamen mit Leerzeichen stößt (nicht nur der klassische Fehlerfall Newline) in ihnen. Auch ohne Leerzeichen sollten Sie den Dateinamen im Shell-Aufruf in Anführungszeichen setzen, um andere Sonderzeichen in den Dateinamen vor der Behandlung durch die Shell zu schützen (obwohl ich nicht genau weiß, wie der Backtick-Operator von Ruby funktioniert) ).
a CVn
0

mit Umbenenner :

$ renamer --find ":" --replace "-" *
Lloyd
quelle
Ich denke, die Installation einer vollständigen node.js-Umgebung zum Umbenennen von Dateien ist etwas zu viel. rename ist ein Tool, das auf vielen Linux-Distributionen vorinstalliert ist. Aber ich denke, für Windows kann dieses Tool großartig sein.
noggerl