Я хочу, чтобы переименовать все файлы в каталоге. Новые имена не следуют шаблону, поэтому я не могу использовать rename
.
Есть ли эффективный способ сделать это, поэтому я не придется использовать mv foo.txt bar.txt
для каждого файла?
Как переименовать несколько файлов в bash (не по шаблону, а с запросом на каждое новое имя)?
3 ответа
когда я думал о написании этого сценария, я проверил, есть ли уже возможные имена, и оказалось, что мое предположение "интерактивный ход" уже написано и готово к использованию. Для большинства систем он должен быть доступен в renameutils-package, который содержит различные инструменты, которые очень полезны:
- qmv/qcp: быстрое перемещение / копирование, записывает все имена файлов в текстовый файл, который затем можно редактировать.
- imv / icp: Интерактивное перемещение / копирование, запрашивает новое имя файлов.
проблема с imv
/icp
в данном случае заключается в том, что те принимают только один аргумент:
imv FILENAME
несколько аргументов приведут к ошибке. Так что вам в основном придется обернуть его в короткий for
петли:
for file in *; do imv "$file"; done
это, конечно, трудно напечатать, поэтому мы должны обернуть это в готовую к использованию функцию, которую мы можем поместить в наш .bashrc
папка.
# Mass Interactive Move
function mimv {
for file in "$*"; do
imv "$file"
done
}
к счастью, imv
показывает имя файла, который в настоящее время процесс, так что нам не нужно никакого заявления Эхо там, так что мы знаем, что происходит.
вы можете использовать эту команду:
for i in *; do
read -p "$i -> " newname
if [[ ! -z "$newname" ]]; then
mv -v -- "$i" "$newname"
fi
done
он предложит вам новое имя для каждого файла, а также для каждого каталога (for i in *
) в текущем каталоге. Новое имя в $newname
. Если вы нажмете введите без ввода нового имени, ничего не делается (-z $newname
проверяет, если $newname
пустой (zero);!
логично not
), в противном случае mv
используется для переименования файла.
если вы хотите изменить имя файла только немного, это более эффективно, если вы можете редактировать это, начиная со старого имени файла, как предлагает @grawity:
for i in *; do
read -p "$i -> " -e -i "$i" newname
if [[ ! -z "$newname" ]]; then
mv -v -- "$i" "$newname"
fi
done
я тестировал его с именами файлов, содержащими пробелы и фигурные скобки, однако, пожалуйста, используйте его на свой страх и риск (и сделайте резервную копию исходных файлов раньше).
#!/usr/bin/env bash for files in $( echo * ); do echo -n Rename $files to which name? ; read new_name ; mv "$files" "$new_name"; done
Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]