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

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

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

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

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

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

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

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

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

решение1

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

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

решение2

Это должно сработать:

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

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

решение3

на самом деле это ответ @Eric выше, но это элегантный ответ, поэтому я публикую его повторно как полноценный ответ, чтобы привлечь к нему больше внимания.

for f in *Huge*; do mv "$f" "${f/Huge/Monstrous}"; done

решение4

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

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

Он переименует все файлы на месте.

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

find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:4}2503${f:8}'

Связанный контент