Переименуйте несколько файлов, заменив определенный шаблон в именах файлов с помощью сценария оболочки
Напишите простой скрипт, который автоматически переименует ряд файлов. В качестве примера мы хотим, чтобы файл *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
чтобы лучше понять вышесказанное.