Повторно нравься part of filename with string in subdirectories and current directory

I want to be able to do this: переямс string1 to string3 and add string2 to the beginning. Sth like Fish renamed to Great_Bear if string Fish is found and Great_ = string2.

So far I have this:

    ls | sed s'/\(.*\)\(string1\)\(.*\)/mv \"&\" \"\1string3\" /' | bash

This does the job for current directory.

    ls -d $PWD/**/* | sed s'/\(.*\)\(string1\)\(.*\)/mv \"&\" \"\1string3\" /' | bash

This works only in subdirectories and not in the one where the рукописный шрифт is.

Also I would like to know how to add string2 to the beginning of the filename.

0
задан 25 November 2015 в 12:03

2 ответа

Это должно добиться цели:

find . -type f -exec rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +
  • find . -type f -exec: поиски рекурсивно файлов в иерархии текущего рабочего каталога и выполняют остаток от расширения командной строки {} + к списку результатов;
  • rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +: соответствия и группы любое количество любого символа до последнего происшествия /, соответствия a /, соответствия и группы любое количество любого символа до последнего происшествия string1, соответствия string1 и соответствия и группы любое количество любого символа; заменяет соответствие первой полученной группой, сопровождаемой a / символ, сопровождаемый string3 сопровождаемый второй полученной группой, сопровождаемой string2 сопровождаемый третьей полученной группой (-n делает rename выполните пробный прогон; удалите его для фактического переименования файлов).
% tree
.
└── dir
    ├── string1_bar.jpg
    ├── string1_foobar.jpg
    └── string1_foo.jpg

1 directory, 3 files
% find . -type f -exec rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +
rename(./dir/string1_foo.jpg, ./dir/string3string2_foo.jpg)
rename(./dir/string1_foobar.jpg, ./dir/string3string2_foobar.jpg)
rename(./dir/string1_bar.jpg, ./dir/string3string2_bar.jpg)
0
ответ дан 26 July 2019 в 14:23

Я использовал бы rename с простым */* соответствие, не globstar шаблон..

rename 's|([^/]+)/(.+)|$1/$1_$2|' */* -vn

Мы соответствуем каталогу и затем чему-то, что он содержит. Это несколько более безопасно, чем globstar, потому что мы не хотим рекурсивно вызывать слишком далеко.

-n на конце останавливает его на самом деле выполнение что-либо. Это просто покажет Вам. Удалите это, когда Вы уверены, что это корректно. Вот немного тестовой обвязки хотя:

$ mkdir -p test/test{1..3} && touch test/test{1..3}/file{1..3}
$ cd test
$ rename 's|([^/]+)/(.+)|$1/$1_$2|' */* -vn
test1/file1 renamed as test1/test1_file1
test1/file2 renamed as test1/test1_file2
test1/file3 renamed as test1/test1_file3
test2/file1 renamed as test2/test2_file1
test2/file2 renamed as test2/test2_file2
test2/file3 renamed as test2/test2_file3
test3/file1 renamed as test3/test3_file1
test3/file2 renamed as test3/test3_file2
test3/file3 renamed as test3/test3_file3
1
ответ дан 26 July 2019 в 14:23

Другие вопросы по тегам:

Похожие вопросы: