Ubuntu: переименуйте несколько файлов в другой каталог - PullRequest
0 голосов
/ 29 апреля 2018

Мне нужно переименовать файлы, которые находятся в этой структуре:

Dir1
--file1
--file2
--  ... 
Dir2
--file1
--file2
--  ... 
... 
Dir62
--file1101
--file1102
--  ...

Новые имена будут 1_01,1_02 в 1-м и 2_01,2_02 во 2-м и т. Д. ...

есть ли способ сделать это за один раз ...

В настоящее время я использую:

ls | cat -n | while read n f; do mv "$f" "10_$n.png"; done

Которые работают в 1 реж одновременно ...

Может быть, лучше?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Если вы запустите эту команду, она будет использовать GNU Parallel , чтобы запустить новую оболочку bash в каждой из папок параллельно, и запустить ls в каждой из них параллельно независимо:

parallel --dry-run -k 'cd {} && ls' ::: */

Пример вывода

cd Dir01/ && ls
cd Dir02/ && ls
cd Dir78/ && ls

Если вы удалите --dry-run, он сделает это по-настоящему.

Итак, вместо запуска ls, давайте теперь посмотрим на использование команды rename в каждом из каталогов. Следующее переименует все файлы в каталоге с последовательно увеличивающимися номерами ($N):

rename --dry-run '$_=$N' *

Пример вывода

'file87' would be renamed to '1'
'file88' would be renamed to '2'
'file89' would be renamed to '3'
'fred' would be renamed to '4'

Все вышесказанное предполагает, что вы хотите команду:

parallel --dry-run -k 'cd {} && rename --dry-run "s/.*/{#}_\$N/" *' ::: */

Вы можете запустить его как есть, и он просто покажет вам, что он собирается делать, фактически ничего не делая.

Если вам нравится внешний вид этого, удалите первый --dry-run и запустите его снова, и он фактически войдет в каждый подкаталог и выполнит пробное переименование, опять же, фактически не меняя ничего.

Если вам все еще нравится внешний вид команды, сделайте небольшую копию ваших файлов где-нибудь во временном каталоге и попробуйте удалить оба параметра --dry-run, если они соответствуют вашим потребностям.

0 голосов
/ 29 апреля 2018
ls -1 -d ./*/ | cat -n | xargs -I % bash -c 'echo "%" | while read dirnum dirname; do { ls "${dirname}" | cat -n | while read filenum filename; do { mv -v "${dirname}${filename}" "${dirnum}_${filenum}.png"; }; done }; done'

Мы создаем структуру каталогов с помощью mkdir и touch:

mkdir Dir{1,2,3,4,5}
touch Dir{1,2,3,4,5}/file{1,2,3}

Что дает результат:

1_1.png
1_2.png
1_3.png
2_1.png
2_2.png
2_3.png
3_1.png
3_2.png
3_3.png
4_1.png
4_2.png
4_3.png
5_1.png
5_2.png
5_3.png
...