У меня есть каталог, полный файлов foo_num.txt. Я хотел бы переименовать все в num.txt (то есть удалить часть "foo_"). Могу ли я сделать это в одну строку?
Поскольку Ваша первая часть разделяется _
, я предлагаю Вас
rename 's/.*?_//' *.txt
?
средства не жадный , поэтому только первое вхождение _
будет заменено.
Пример
$ 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
<час> Для замены всего использования случаев
rename 's/.*_//' *.txt
Пример
$ 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
Если Вы не хотите беспокоиться для циклов в Bash, Вы могли бы хотеть использовать rename
программа:
rename "s/foo_//" *.txt
первым аргументом является выражение Perl, определяющее строковое заменяющее правило. В этом случае: [s] заменяют "нечто _" с "".
второй аргумент фильтрует файлы, которые Вы хотите переименовать.