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?
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.
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