Переименуйте несколько файлов, заменив определенный шаблон в именах файлов с помощью сценария оболочки

Напишите простой скрипт, который автоматически переименует ряд файлов. В качестве примера мы хотим, чтобы файл *001.jpg был переименован в определенную пользователем строку + 001.jpg (например: MyVacation20110725_001.jpg). Этот сценарий используется для того, чтобы фотографии цифровой камеры имели имена файлов, которые имеют некоторый смысл.

Мне нужно написать скрипт для этого. Может кто-нибудь подсказать, с чего начать?

8 ответов

Решение

Пример, который поможет вам оторваться от земли.

for f in *.jpg; do mv "$f" "$(echo "$f" | sed s/IMG/VACATION/)"; done

В этом примере я предполагаю, что все ваши файлы изображений начинаются с "IMG", и вы хотите заменить "IMG" на "VACATION".

Оболочка автоматически оценивает *.jpg для всех соответствующих файлов.

Второй аргумент mv (новое имя файла) является выводом sed команда, которая заменяет "IMG" на "ОТПУСК".

Если ваши имена файлов содержат несколько последовательных пробелов, обратите особое внимание на "$f" нотации. Вам нужны двойные кавычки, чтобы сохранить такие пробелы.

Вы можете использовать утилиту переименования, чтобы переименовать несколько файлов по шаблону. Например, следующая команда добавит строку MyVacation2011_ ко всем файлам с расширением jpg.

rename 's/^/MyVacation2011_/g' *.jpg

или же

rename <pattern> <replacement> <file-list>

В этом примере я предполагаю, что все ваши файлы изображений начинаются с "IMG", и вы хотите заменить "IMG" на "VACATION"

Решение: сначала идентифицируйте все файлы jpg, а затем замените ключевое слово

find . -name '*jpg' -exec bash -c 'echo mv $0 ${0/IMG/VACATION}' {} \; 
for file in *.jpg ; do mv $file ${file//IMG/myVacation} ; done

Снова предположим, что все ваши файлы изображений имеют строку "IMG", и вы хотите заменить "IMG" на "myVacation".

С bash вы можете напрямую конвертировать строку с расширением параметра.

Пример: если файл IMG_327.jpg, mv Команда будет выполнена так, как будто вы делаете mv IMG_327.jpg myVacation_327.jpg, И это будет сделано для каждого файла, найденного в каталоге, соответствующем *.jpg,

IMG_001.jpg -> myVacation_001.jpg
IMG_002.jpg -> myVacation_002.jpg
IMG_1023.jpg -> myVacation_1023.jpg
и так далее...

find . -type f | 
sed -n "s/\(.*\)factory\.py$/& \1service\.py/p" | 
xargs -p -n 2 mv

Например, будут переименованы все файлы в cwd с именами, заканчивающимися на "factory.py", которые будут заменены именами, заканчивающимися на "service.py"

объяснение:

1) в sed cmd флаг -n будет подавлять нормальное поведение эхо-ввода для вывода после применения команды s ///, а параметр p на s /// заставит записать вывод в случае замены. поскольку подпрограмма будет создаваться только при совпадении, sed будет выводить только файлы, заканчивающиеся на "factory.py"

2) в строке замены s /// мы используем "& " для интерполяции всей совпадающей строки, за которой следует пробел, в замену. поэтому очень важно, чтобы наш RE соответствовал всему имени файла. после пробела мы используем "\1service.py" для интерполяции строки, которую мы проглотили перед "factory.py", а затем "service.py", заменив ее. Таким образом, для более сложных преобразований вам нужно изменить аргументы на s/// (с повторным совпадением, которое по-прежнему соответствует всему имени файла)

пример вывода:

foo_factory.py foo_service.py
bar_factory.py bar_service.py

3) мы используем xargs с -n 2 для одновременного использования вывода строк с разделителями sed 2, передавая их в mv (я также добавил туда параметр -p, чтобы вы могли чувствовать себя в безопасности при запуске этого). вуаля.

Другой вариант:

for i in *001.jpg
do
  echo "mv $i yourstring${i#*001.jpg}"
done

Удалить echo после того, как у вас все правильно.

Подстановка параметров с # сохранится только последняя часть, поэтому вы можете изменить ее название.

Не могу прокомментировать ответ Сусама Пала, но если вы имеете дело с пробелами, я бы заключил в кавычки:

for f in *.jpg; do mv "$f" "`echo $f | sed s/\ /\-/g`"; done;

Вы можете попробовать это:

for file in *.jpg;
do
  mv $file $somestring_${file:((-7))}
done

Вы можете увидеть "расширение параметров" в man bash чтобы лучше понять вышесказанное.

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