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

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

21
задан n.st
25.04.2023 11:19 Количество просмотров материала 3111
Распечатать страницу

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 2023-04-26 19:07

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

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 2023-04-26 21:24
#!/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 2023-04-26 23:41

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх