Copiez et collez un tas de fichiers avec un nom différent

10

J'ai un tas de fichiers texte avec le nom

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

Je voudrais copier (et conserver les fichiers originaux) chaque fichier et le coller sous différents noms (dans le même dossier) comme,

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

Comment puis-je le faire en utilisant un simple script?

phénomène
la source

Réponses:

13

Changez le répertoire où vous avez les fichiers originaux.

Ensuite, testez avec la ligne de commande suivante,

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

et si ça a l'air bien, retirez echoet faites la copie,

for i in *_original.*;do cp -p "$i" "${i/_original./_copy.}";done
sudodus
la source
8

Vous pouvez utiliser à mcppartir du mmvpackageInstaller mmv de la manière suivante:

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

Cela copiera chaque fichier contenant la chaîne «original» dans le répertoire courant et remplacera cette chaîne par «copier». Vous pouvez tester ce mcpqui fera en ajoutant l' -nindicateur, mais il n'écrasera pas silencieusement les fichiers, mais vous le demandera. L'utilisation mmva l'avantage de cpne pas avoir à l'appeler pour chaque fichier - avec mille fichiers comme ceux que vous semblez copier, cela fait une différence.

Vous pouvez également utiliser GNUparallel Installer en parallèle de la manière suivante (à des --dry-runfins de test, supprimez-la pour effectuer la copie):

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

ou, si cela donne l'erreur "Argument list too long":

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

Exemple d'exécution

$ 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

Disons-le time, exécutez plus de 1000 fichiers de 100 Ko chacun sur une machine lente :

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