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 d'origine) chaque fichier et coller à des noms différents (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 faire cela en utilisant un script simple?
Changer le répertoire où vous avez les fichiers originaux.
Puis testez avec la ligne de commande suivante,
for i in *_original.*;do echo cp -p "$i" "${i/_original./_copy.}";done
et si cela vous convient, supprimez echo
et copiez-le,
for i in *_original.*;do cp -p "$i" "${i/_original./_copy.}";done
Vous pouvez utiliser mcp
à partir du package mmv
name__ de la manière suivante:
mcp "*original*" "#1copy#2"
Ceci copiera tous les fichiers contenant la chaîne "originale" dans le répertoire actuel et remplacera cette chaîne par "copier". Vous pouvez tester ce que mcp
fera en ajoutant le drapeau -n
. Toutefois, il ne remplacera pas les fichiers en mode silencieux, mais vous le demandera. Utiliser mmv
a l'avantage sur cp
de ne pas avoir à l'appeler pour chaque fichier - avec un millier de fichiers que vous semblez copier, cela fait une différence.
Vous pouvez également utiliser GNU parallel
name__ de la manière suivante (--dry-run
est pour le test, supprimez-le pour effectuer la copie):
parallel --dry-run cp -p "{}" "{=s/original/copy/=}" ::: *
ou, si cela donne l'erreur "Liste d'arguments trop longue":
printf "%s\0" * | parallel --dry-run -0 cp -p "{}" "{=s/original/copy/=}"
$ 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
Lançons time
it, exécutons 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