web-dev-qa-db-fra.com

Supprimer la première partie des noms de fichiers

J'ai un répertoire plein de fichiers foo_num.txt. J'aimerais tout renommer en num.txt (c'est-à-dire supprimer la partie "foo_"). Puis-je le faire en une seule ligne?

4
Ditte

Si vous ne voulez pas vous occuper des boucles for dans Bash, vous pouvez utiliser le programme rename :

rename "s/foo_//" *.txt

Le premier argument est l'expression Perl définissant la règle de remplacement de chaîne. Dans ce cas: remplacez "foo_" par "".

Le deuxième argument filtre les fichiers que vous souhaitez renommer.

5
Falko

Comme votre première partie est séparée par un _ je vous suggère

rename 's/.*?_//' *.txt

Le ? signifie non glouton, par conséquent, seule la première occurrence de _ sera remplacée.

Exemple

$ ls -laog
total 4280
drwxrwxr-x  2 4329472 Aug 10 13:05 .
drwx------ 55   20480 Aug 10 12:54 ..
-rw-rw-r--  1       0 Aug 10 13:05 foo_1_1.txt
-rw-rw-r--  1       0 Aug 10 13:05 foo_2_2.txt
-rw-rw-r--  1       0 Aug 10 13:05 foo_3_3.txt

$ rename 's/.*?_//' *.txt

$ ls -laog
total 4280
drwxrwxr-x  2 4329472 Aug 10 13:06 .
drwx------ 55   20480 Aug 10 12:54 ..
-rw-rw-r--  1       0 Aug 10 13:05 1_1.txt
-rw-rw-r--  1       0 Aug 10 13:05 2_2.txt
-rw-rw-r--  1       0 Aug 10 13:05 3_3.txt

Pour remplacer toutes les occurrences, utilisez

rename 's/.*_//' *.txt

Exemple

$ ls -laog
total 4280
drwxrwxr-x  2 4329472 Aug 10 13:08 .
drwx------ 55   20480 Aug 10 12:54 ..
-rw-rw-r--  1       0 Aug 10 13:08 foo_1_1.txt
-rw-rw-r--  1       0 Aug 10 13:08 foo_2_2.txt
-rw-rw-r--  1       0 Aug 10 13:08 foo_3_3.txt

$ rename 's/.*_//' *.txt

$ ls -laog
total 4280
drwxrwxr-x  2 4329472 Aug 10 13:09 .
drwx------ 55   20480 Aug 10 12:54 ..
-rw-rw-r--  1       0 Aug 10 13:08 1.txt
-rw-rw-r--  1       0 Aug 10 13:08 2.txt
-rw-rw-r--  1       0 Aug 10 13:08 3.txt
1
A.B.