Заменить часть имени файла на строку в подкаталогах и текущем каталоге

Заменить часть имени файла на строку в подкаталогах и текущем каталоге

Я хочу иметь возможность сделать это: переименовать 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)

Связанный контент