Переименование кратных файлов с помощью Bash-скриптов

Я хочу переименовать несколько файлов в том же каталоге, используя скрипты Bash. Имена файлов следующие:

file2602201409853.p file0901201437404.p file0901201438761.p file1003201410069.p file2602201410180.p 

Я хочу переименовать в следующий формат:

 file2503201409853.p file2503201437404.p file2503201438761.p file2503201410069.p file2503201410180.p 

Я читал о команде переименования и стараюсь сделать это таким образом, но ничего не делает, думаю, у меня есть вопросы о синтаксисе. Затем я прочитал, что вы можете сделать цикл, используя команду mv, следующим образом:

 for file in cmpsms*2014*.p; do mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}" done 

Но я не могу переименовать файлы. Что я делаю не так?

6 Solutions collect form web for “Переименование кратных файлов с помощью Bash-скриптов”

Вы были правы, чтобы сначала переименовать. Синтаксис немного странный, если вы не привыкли к регулярным выражениям, но это самый быстрый или короткий маршрут, когда вы знаете, что делаете:

 rename 's/\d{4}/2503/' file* 

Это просто соответствует первым 4 номерам и меняет их по тем, которые вы указали.

И тестовый жгут ( -vn означает подробный, но ничего не делать ), используя ваши имена:

 $ rename 's/\d{4}/2503/' file* -vn file0901201437404.p renamed as file2503201437404.p file0901201438761.p renamed as file2503201438761.p file1003201410069.p renamed as file2503201410069.p file2602201409853.p renamed as file2503201409853.p file2602201410180.p renamed as file2503201410180.p 

Это должно сделать трюк:

 for f in file*; do mv $f ${f/${f:4:8}/25032014}; done 

Он заменяет строку 4-го и 12-го символов «25032014».

это на самом деле ответ Эрика сверху – но это изящный ответ, поэтому я пересказываю его как правильный ответ, чтобы привлечь к нему больше внимания.

 for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done 
 ptrn='file[0-9][0-9][0-9][0-9]2014[0-9][0-9][0-9][0-9][0-9].p' path=/dir ( set -- "${path}/"${ptrn} ; for f ; do { echo "mv ${path}/${f} \ ${path}/file25032014${f#2014}" } ; done ) 

Это должно сделать трюк. Примечание. У меня нет привычки передавать массовые команды mv – как написано, это просто эхо. Вам придется разобраться с этим, прежде чем он сработает.

Если вы обнаружите, что так много делаете, найдите «rename.pl». Это perl-скрипт, но позволяет просто передать его perl-код (например, как выражение ///), и он будет выполнять массовое переименование на основе этого выражения или кода.

Здесь есть базовая версия: http://stackoverflow.org/wiki/Rename.pl, но есть и другие версии, плавающие по сети. Это было вокруг в течение многих веков и возрастов.

Простой нативный способ сделать это без цикла, с обход каталога :

 find -type f | xargs -I {} mv {} {}.txt 

Он переименует каждый файл на место.

И ниже рабочий пример с распараллеливанием :

 find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:4}2503${f:8}' 
  • Автоматически переименовывать файл, если есть дублирующееся имя файла
  • Добавление префиксов / суффиксов в имена файлов без их повторного ввода?
  • Как переименовать все файлы со специальными символами и пробелами в каталоге?
  • Переименование файлов с именем родительского родительского каталога
  • Переименование пакетного файла: лучше, чем случайный идентификатор, чтобы предотвратить удаление файлов с повторяющимися именами файлов?
  • Сглаживание структуры папок
  • Как изменить имя логического тома в группе томов
  • Заменить символы подчеркивания пробелами для всех файлов в каталоге
  • Замените новые строки char (^ M) во всех файлах, а затем переименуйте файл на основе строки char
  • Как переименовать файлы, обменивая подстроки в именах файлов?
  • Попытка сделать арифметику в инструменте переименования Perl (Debian)
  • Linux и Unix - лучшая ОС в мире.