Umbenennen mehrerer Dateien mithilfe von Bash-Skripten

Ich möchte mehrere Dateien im selben Verzeichnis mithilfe von Bash-Skripten umbenennen. Die Namen der Dateien lauten wie folgt:

file2602201409853.p file0901201437404.p file0901201438761.p file1003201410069.p file2602201410180.p 

Ich möchte in das folgende Format umbenennen:

file2503201409853.p file2503201437404.p file2503201438761.p file2503201410069.p file2503201410180.p 

Ich habe über den Umbenennungsbefehl gelesen und versucht, dies auf diese Weise zu tun, aber es tut nichts. Ich glaube, ich habe Fragen zur Syntax. Dann habe ich gelesen, dass Sie mit dem Befehl mv eine Schleife wie folgt erstellen können:

for file in cmpsms*2014*.p; do mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}" done 

Ich kann die Dateien aber nicht umbenennen. Was mache ich falsch?

Kommentare

  • mögliches Duplikat von Wie kann ich viel umbenennen? von Dateien, die einen regulären Ausdruck verwenden?
  • Sie können ' keinen Musterausdruck auf der rechten Seite eines Ersatzausdrucks für die Parametererweiterung haben. Was haben Sie erwartet, wo sich diese * befindet?
  • @Kiwy Bei dieser Frage geht es darum, einen Teil des Dateinamens zu entfernen. Ergo, höchst zweifelhaft dupliziert.
  • Bitte beschreiben Sie beim nächsten Mal die Änderungen des Dateinamens, die Sie vornehmen möchten (ich musste mir das eine Weile ansehen, bevor ich die Unterschiede und Ähnlichkeiten sah). Beispiele sind gut, aber eine Beschreibung sowie Beispiele ist noch besser.

Antwort

Sie haben zu Recht zuerst über eine Umbenennung nachgedacht. Die Syntax ist etwas seltsam, wenn Sie nicht an reguläre Ausdrücke gewöhnt sind, aber es ist bei weitem der schnellste / kürzeste Weg, sobald Sie wissen, was Sie tun:

rename "s/\d{4}/2503/" file* 

Das stimmt einfach mit den ersten 4 Zahlen überein und tauscht sie gegen die von Ihnen angegebenen aus.

Und ein Testgeschirr (-vn bedeutet, ausführlich zu sein, aber nicht „t“ mache alles) mit deinen Dateinamen:

$ rename "s/\d{4}/2503/" file* -vn file0901201437404.p renamed as file2503201437404.p file0901201438761.p renamed as file2503201438761.p file1003201410069.p renamed as file2503201410069.p file2602201409853.p renamed as file2503201409853.p file2602201410180.p renamed as file2503201410180.p 

Kommentare

  • Hinweis dass dies die Perl-Umbenennung auf Debian und Derivaten (Ubuntu, Mint,…) ist. Bei anderen Linux-Distributionen ist rename ein völlig anderes Tool zum Umbenennen von Dateien (das Debian als rename.ul liefert).
  • Wenn es Ihnen an einem solchen Tool mangelt, lesen Sie die Antwort von @Michael Campbell. Ich denke, jede Verteilung ersetzt standardmäßig rename wie Debian.

Antwort

Dies sollte den Trick machen:

for f in file*; do mv $f ${f/${f:4:8}/25032014}; done 

Ersetzt die Zeichenfolge zwischen dem 4. und dem 12. Zeichen durch „25032014“.

Kommentare

  • diese for f in file*; do mv $f ${f/${f:4:4}/2503}; done funktioniert auch.
  • Diese ' s nett. Wenn Sie nur ein reguläres Wort für ein Wort ersetzen möchten, funktioniert es wie sed. z.B. for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done
  • @Eric – Ich habe Ihre Antwort als Alternative veröffentlicht, weil ich denke, dass sie ' klarer und eleganter ist . Wenn Sie es auch als Antwort veröffentlichen möchten, lösche ich meine '. Danke!
  • Warum fehlen bei doppelte Anführungszeichen ?
  • Es gibt mir einen Fehler: " mv: target ' FILE_NAME ' ist kein Verzeichnis "

Antwort

Dies ist wirklich die Antwort von @Eric von oben – aber es ist eine elegante Antwort Ich reposte es als richtige Antwort, um mehr Aufmerksamkeit darauf zu lenken.

for f in *Huge*; do mv "$f" "${f/Huge/Monstrous}"; done 

Antwort

ptrn="file[0-9][0-9][0-9][0-9]2014[0-9][0-9][0-9][0-9][0-9].p" path=/dir ( set -- "${path}/"${ptrn} ; for f ; do { echo "mv ${path}/${f} \ ${path}/file25032014${f#2014}" } ; done ) 

Dies sollte den Trick tun. Hinweis – Ich habe nicht die Angewohnheit, Massen-MV-Befehle zu übergeben – wie geschrieben ist es nur ein Echo. Sie“ Ich muss das klären, bevor es funktioniert.

Antwort

Eine einfache native Methode, um dies ohne Schleife zu tun, mit Verzeichnisdurchquerung :

find -type f | xargs -I {} mv {} {}.txt 

Es wird jedes umbenannt Datei an Ort und Stelle.

Und unter einer Arbeit Beispiel mit Parallelisierung :

find -name "file*.p" | parallel "f="{}" ; mv -- {} ${f:0:4}2503${f:8}" 

Kommentare

  • Es war ein einfacher erster Ansatz, sich eine bessere Lösung vorzustellen. Wenn Sie einen funktionierenden Befehl wünschen, gehen Sie wie folgt vor:
  • find -type f -name "file*.p" | parallel 'ext="{}" ; mv -- {} ${ext:0:4}2503${ext:8}'

Antwort

Wenn Sie feststellen, dass Sie so etwas häufig tun, suchen Sie nach „rename.pl“. Es ist ein Perl-Skript, aber Sie können es einfach perl-Code eingeben (wie als /// Ausdruck), und es wird eine Massenumbenennung basierend auf diesem Ausdruck oder Code durchgeführt.

Es gibt eine Basisversion hier: http://stackoverflow.org/wiki/Rename.pl , aber es gibt andere Versionen, die im Netz schweben. Es gibt es schon seit Ewigkeiten und Ewigkeiten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.