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

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

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

Пример, который поможет вам выйти из-под земли.

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

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

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

Второй аргумент mv (новое имя файла) – это результат команды sed которая заменяет «IMG» на «VACATION».

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

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

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

или

 rename    
 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
и так далее …

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

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

 find . -name '*jpg' -exec bash -c 'echo mv $0 ${0/IMG/VACATION}' {} \; 

Вы можете попробовать следующее:

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

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

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

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

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

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

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

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

 for f in *.jpg; do mv "$f" "`echo $f | sed s/\ /\-/g`"; done; 
  • Какой код возврата мне нужен в PS *, чтобы убедиться, что терминал вернулся в обычные настройки в командной строке?
  • Передавать все переменные из одного shellscript в другой?
  • Зачем запускать команду оболочки с обратным слэшем?
  • Открытие и запись данных в текстовый файл с использованием сценариев bash / shell
  • Войти через SSH без пароля
  • Как запустить оболочку Windows 7 Explorer с привилегиями администратора по умолчанию?
  • Проверить скрипт оболочки, если удаленный TCP-порт открыт
  • Как выполнить XPath one-liners из оболочки?
  • Какие символы нужно избегать при использовании Bash?
  • Как запустить сценарий оболочки в OS X двойным щелчком?
  • Инструмент для разметки больших файлов
  • Давайте будем гением компьютера.