Удалить первую часть имен файлов

У меня есть каталог, полный файлов foo_num.txt. Я хотел бы переименовать все в num.txt (то есть удалить часть "foo_"). Могу ли я сделать это в одну строку?

2 ответа

Если вы не хотите беспокоиться о циклах for в Bash, вы можете использовать rename программа:

rename "s/foo_//" *.txt

Первый аргумент - это выражение Perl, определяющее правило замены строк. В этом случае: [s] уберите "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
Другие вопросы по тегам