Похожие вопросы

Как сделать резервную копию недавно измененных файлов в Bash?
Перехват ошибки команды bash в переменной
Как изменить приглашение bash?
Возможно ли "хвост-f "выход" dmesg`?
Как мой MacBook пинговать Google, но не мой роутер?
Резервное копирование закладок Firefox и других личных файлов bash скрипт
Создание сценария BASH " для " обрабатывать имена файлов с пробелами (или обходной путь)
Использование wget для рекурсивного обхода сайта и загрузки изображений
Почему я получаю "rvm: команда не найдена" на Ubuntu?
Как соединить файлы в командной строке без создания временных файлов?
Я добавил новый путь в список путей, но не смог выполнить программу из любого места linux
Putty: войдите в систему, выполните команду / измените переменную среды и не закрывайте сеанс
как удалить файл в /etc при rc.sysinit выполняются?
Как закодировать дефис в открытой команде терминала Bash?
Удалить пустые колонки из CSV файл с bash-скрипт

Как переименовать несколько файлов в bash (не по шаблону, а с запросом на каждое новое имя)?

Я хочу, чтобы переименовать все файлы в каталоге. Новые имена не следуют шаблону, поэтому я не могу использовать rename.
Есть ли эффективный способ сделать это, поэтому я не придется использовать mv foo.txt bar.txt для каждого файла?

5
задан n.st
источник

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 показывает имя файла, который в настоящее время процесс, так что нам не нужно никакого заявления Эхо там, так что мы знаем, что происходит.

3
отвечен Bobby 2013-05-10 06:51:28
источник

вы можете использовать эту команду:

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

я тестировал его с именами файлов, содержащими пробелы и фигурные скобки, однако, пожалуйста, используйте его на свой страх и риск (и сделайте резервную копию исходных файлов раньше).

3
отвечен mpy 2013-05-09 17:03:32
источник
#!/usr/bin/env bash

for files in $( echo * );
do
     echo -n Rename $files  to which name? ;
     read new_name ;
     mv "$files" "$new_name";
done
-1
отвечен Hennes 2013-05-09 16:49:29
источник

Другие вопросы bash linux rename