web-dev-qa-db-fra.com

Copier et coller un tas de fichiers avec un nom différent

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?

10
phenomenon

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
13
sudodus

Vous pouvez utiliser mcpà partir du package mmvname__Install mmv 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 mcpfera en ajoutant le drapeau -n. Toutefois, il ne remplacera pas les fichiers en mode silencieux, mais vous le demandera. Utiliser mmva l'avantage sur cpde 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 parallelname__ Install parallel 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/=}"

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

Lançons timeit, 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
8
dessert