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.
Это должно добиться цели:
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)
Я использовал бы 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