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