
Я хочу иметь возможность сделать это: переименовать string1
в string3
и добавить string2
в начало. Что-то вроде Fish переименовано в Great_Bear, если строка Fish найдена и Great_ = string2.
Пока у меня вот что:
ls | sed s'/\(.*\)\(string1\)\(.*\)/mv \"&\" \"\1string3\" /' | bash
Это выполняет работу для текущего каталога.
ls -d $PWD/**/* | sed s'/\(.*\)\(string1\)\(.*\)/mv \"&\" \"\1string3\" /' | bash
Это работает только в подкаталогах, а не в том, где находится скрипт.
Также я хотел бы узнать, как добавить string2
в начало имени файла.
решение1
Я бы использовал rename
простую */*
спичку, а не шаблон «Глобстар»..
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
решение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/' {} +
: соответствует и группирует любое количество любых символов до последнего вхождения/
, соответствует/
, соответствует и группирует любое количество любых символов до последнего вхожденияstring1
, соответствуетstring1
и соответствует и группирует любое количество любых символов; заменяет соответствие первой захваченной группой, за которой следует/
символ, за которым следует, за которым следует, за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)