Kopieren Sie eine Reihe von Dateien mit unterschiedlichen Namen und fügen Sie sie ein

10

Ich habe eine Reihe von Textdateien mit dem Namen

foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_original.in
...
...
foo_bar_abc_1_1000_geh_original.in

Ich möchte jede Datei kopieren (und die Originaldateien behalten) und in verschiedene Namen (im selben Ordner) einfügen , wie z.

foo_bar_abc_1_01_geh_copy.in
foo_bar_abc_1_02_geh_copy.in
foo_bar_abc_1_03_geh_copy.in
...
...
foo_bar_abc_1_1000_geh_copy.in

Wie kann ich das mit einem einfachen Skript machen?

Phänomen
quelle

Antworten:

13

Wechseln Sie in das Verzeichnis, in dem Sie die Originaldateien haben.

Testen Sie dann mit der folgenden Befehlszeile:

for i in *_original.*;do echo cp -p "$i" "${i/_original./_copy.}";done

und wenn es gut aussieht, entfernen Sie echound kopieren Sie,

for i in *_original.*;do cp -p "$i" "${i/_original./_copy.}";done
Sudodus
quelle
8

Sie können mcpaus dem mmvPaketInstallieren Sie mmv folgendermaßen verwenden:

mcp "*original*" "#1copy#2"

Dadurch wird jede Datei kopiert, die die Zeichenfolge "original" im aktuellen Verzeichnis enthält, und diese Zeichenfolge wird durch "copy" ersetzt. Sie können testen, was mcpdurch Hinzufügen des -nFlags geschehen soll. Es werden jedoch keine Dateien stillschweigend überschrieben, sondern Sie werden gefragt. Die Verwendung mmvhat den Vorteil, cpdass Sie sie nicht für jede einzelne Datei aufrufen müssen - bei tausend Dateien, wie Sie sie scheinbar kopieren, macht dies einen Unterschied.

Sie können GNU auchparallel Parallel installieren folgendermaßen verwenden ( --dry-runzum Testen entfernen Sie es, um das Kopieren durchzuführen):

parallel --dry-run cp -p "{}" "{=s/original/copy/=}" ::: *

oder, wenn dies den Fehler "Argumentliste zu lang" ergibt:

printf "%s\0" * | parallel --dry-run -0 cp -p "{}" "{=s/original/copy/=}"

Beispiellauf

$ ls -1
foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_original.in
foo_bar_abc_1_04_geh_original.in
$ mcp "*original*" "#1copy#2"
$ ls -1
foo_bar_abc_1_01_geh_copy.in
foo_bar_abc_1_01_geh_original.in
foo_bar_abc_1_02_geh_copy.in
foo_bar_abc_1_02_geh_original.in
foo_bar_abc_1_03_geh_copy.in
foo_bar_abc_1_03_geh_original.in
foo_bar_abc_1_04_geh_copy.in
foo_bar_abc_1_04_geh_original.in

Lassen Sie es uns timeüber 1000 Dateien mit jeweils 100 KiB auf einem langsamen Computer ausführen :

$ time mcp "*original*" "#1copy#2"
real    0m1.114s
user    0m0.000s
sys     0m0.132s
Dessert
quelle