Dateien mit besonderer Struktur schnell umbenennen

0

Ich habe die Lösung hier ausgecheckt, aber sie geht nicht gut auf mein Problem ein, da sie nicht die spezifische Struktur meiner Benennung verwendet.

Ich habe eine Sammlung von Dateien, die zum Beispiel systematisch aufgelistet und benannt sind

filep-x

Dabei ist x eine Zahl, die ziemlich groß sein kann, und p ist ein Marker für eine "Makrocollection". Ich möchte alle Dateien in einer solchen Makrocollection als Vorlage kopieren und alle kopierten Dateien automatisch umbenennen als

fileq-x

Mit anderen Worten, gibt es eine Option, mit der ich Namen mithilfe des Terminals automatisch ersetzen kann (wie es in vielen Editoren möglich ist), ohne mit zusätzlichen Dokumenten zu arbeiten?

Danke im Voraus!

mdot
quelle

Antworten:

2

Dies könnte eine Aufgabe sein pax, vorausgesetzt, es gibt eine einheitliche Namenskonvention.

cd directory

pax -rws/filep/fileq/ filep-* /path/to/copy/directory
fd0
quelle
1

Normalerweise kann dies mit einer bashSchleife durchgeführt werden - nicht die schnellste, sondern die einfachste. Im Terminaltyp:

for f in filep-* ; do mv -iv "$f" "$(echo "$f" | sed 's/p/q/')" ; done

Erklärungen:

  • for f in filep-* ; do -> Gehen Sie für alle aufgerufenen Dateien filep-anythingwie folgt vor
  • mv -iv A BVerschieben Sie (= umbenennen) A nach B, während Sie sagen, was Sie tun, -vund um Bestätigung bitten, bevor Sie eine vorhandene Datei überschreiben-i
  • wollten eine Datei verschieben "$f"(Anführungszeichen zur Behebung von Problemen mit z. B. Leerzeichen in Dateinamen) nach:
  • $( $echo $f | sed 's/A/B' )Drucken Sie den Dateinamen aus und verwenden Sie dann, sedum sdas erste (! und einzige) Vorkommen von Amit zu ersetzen B(dies kann auch sein sed 's/this123/that456/', aber beachten Sie, dass es mit dem ersten Treffer übereinstimmt).

Um sicherzustellen, dass es sich wie erwartet verhält, führen Sie zunächst Folgendes aus:

for f in filep-* ; do echo mv -iv "$f" "$(echo "$f" | sed 's/p/q/')" ; done

Dies gibt nur den Befehl aus, der für jede Datei ausgeführt werden soll und so aussehen sollte mv -i filep-x fileq-x.

Hinweis: Dies dient zum Umbenennen der Dateien und somit nach dem Kopieren. Das Kopieren und Umbenennen in einem Vorgang ist damit nicht möglich. Es soll auch aus dem Verzeichnis ausgeführt werden, in dem sich die Dateien befinden.

Fiximan
quelle
Ich gehe davon aus, dass Sie Ihren Code nicht getestet haben, da die for ... in ... doneBefehle, wie sie geschrieben wurden, möglicherweise nicht ordnungsgemäß ausgeführt werden konnten, da Sie darauf verwiesen haben, es "$file"aber nicht zugewiesen haben! Es sollte "$f"nicht sein "$file". Außerdem versuchen Sie, eine Datei zu verschieben, die nicht vorhanden ist, weil for f in fileq-*es so sein soll for f in filep-*. Die vorhandenen Dateien haben einen pnicht qvor dem -im OP und sollen qim Rahmen des Umbenennens sein. Wenn ich mich irre, sedwäre Ihr Befehl falsch.
user3439894
@ user3439894 - Danke für die Korrekturen. Ich habe den Code getestet, aber verschiedene Variablen verwendet, daher die Verwechslung zwischen fileq-und filep-sowie zwischen $fileund $f(diese passiert mir in der Hälfte meiner bashSkripte ... eine schlechte Angewohnheit). - Aktualisierte.
Fiximan