
Я хочу переименовать несколько файлов в одном каталоге с помощью скриптов 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}'