Переименуйте несколько файлов, заменив определенный шаблон в именах файлов, используя оболочку script
Напишите простой script, который автоматически переименует несколько файлов. В качестве примера мы хотим, чтобы файл * 001.jpg переименован в определенную пользователем строку + 001.jpg(например: MyVacation20110725_001.jpg) Использование для этого script заключается в том, чтобы получить фотографии цифровой камеры, чтобы иметь имена файлов, которые имеют какой-то смысл.
Мне нужно написать оболочку script для этого. Может кто подскажет, с чего начать?
Ответы
Ответ 1
Пример, который поможет вам сойти с земли.
for f in *.jpg; do mv "$f" "`echo $f | sed s/IMG/VACATION/`"; done
В этом примере я предполагаю, что все ваши файлы изображений начинаются с "IMG" , и вы хотите заменить "IMG" на "VACATION".
Оболочка автоматически оценивает *.jpg
ко всем соответствующим файлам.
Второй аргумент mv
(новое имя файла) - это вывод команды sed
, которая заменяет "IMG" на "VACATION".
Ответ 2
Вы можете использовать утилиту rename, чтобы переименовать несколько файлов по шаблону. Например, следующая команда добавит строку MyVacation2011_ ко всем файлам с расширением jpg.
rename 's/^/MyVacation2011_/g' *.jpg
или
rename <pattern> <replacement> <file-list>
Ответ 3
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
и так далее...
Ответ 4
В этом примере я предполагаю, что все ваши файлы изображений начинаются с "IMG", и вы хотите заменить "IMG" на "VACATION"
: сначала идентифицировали все файлы jpg, а затем заменили ключевое слово
find . -name '*jpg' -exec bash -c 'echo mv $0 ${0/IMG/VACATION}' {} \;
Ответ 5
Вы можете попробовать следующее:
for file in *.jpg;
do
mv $file $somestring_${file:((-7))}
done
Вы можете увидеть "расширение параметра" в man bash
, чтобы лучше понять выше.
Ответ 6
Не могу комментировать ответ Susam Pal, но если вы имеете дело с пробелами, я бы использовал кавычки:
for f in *.jpg; do mv "$f" "`echo $f | sed s/\ /\-/g`"; done;
Ответ 7
Другой вариант:
for i in *001.jpg
do
echo "mv $i yourstring${i#*001.jpg}"
done
удалите echo
после того, как вы это исправите.
Подстановка параметров с помощью #
будет содержать только последнюю часть, поэтому вы можете изменить ее имя.
Ответ 8
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///заставит писать вывод, если подстановка сделан. так как sub будет производиться только по совпадению, sed будет выводить только файлы, заканчивающиеся на "factory.py"
2) в строке замены s///мы используем "&" для интерполяции всей строки соответствия, за которой следует символ пробела, в замещение. из-за этого жизненно важно, чтобы наш RE соответствовал всему имени файла. после пробела char мы используем "\ 1service.py" для интерполяции строки, которую мы сглотнули до "factory.py" , а затем "service.py", заменив ее. Таким образом, для более сложных преобразований вам нужно будет изменить args на s///(с повторением, все еще совпадающим со всем именем файла)
Пример вывода:
foo_factory.py foo_service.py
bar_factory.py bar_service.py
3) мы используем xargs с -n 2 для одновременного потребления строк с разделителями sed 2, передавая их в mv (я также устанавливаю опцию -p, чтобы вы могли чувствовать себя в безопасности при ее запуске). вуаля.