Я хочу переименовать несколько файлов в одном каталоге, используя сценарии 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
Но я не могу переименовать файлы. Что я делаю не так?
*
?Ответы:
Вы были правы рассмотреть вопрос о переименовании в первую очередь. Синтаксис немного странный, если вы не привыкли к регулярным выражениям, но это, безусловно, самый быстрый / короткий маршрут, когда вы знаете, что делаете:
Это просто соответствует первым 4 числам и заменяет их на те, которые вы указали.
И тестовый набор (
-vn
значит, будьте многословны, но ничего не делайте ), используя ваши имена файлов:источник
rename
это совершенно другой инструмент переименования файлов (который поставляется вместе с Debianrename.ul
).rename
как это делал Debian.Это должно сделать трюк:
Он заменяет строку между 4-м и 12-м символом на «25032014».
источник
for f in file*; do mv $f ${f/${f:4:4}/2503}; done
тоже работа.for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done
это действительно @ ответ Эрика сверху - но это элегантный ответ, поэтому я публикую его как правильный ответ, чтобы привлечь к нему больше внимания.
источник
Это должно сделать свое дело. Примечание - я не имею привычки передавать массовые команды mv - как написано, это просто эхо. Вы должны разобраться, прежде чем это сработает.
источник
Простой нативный способ сделать это без зацикливания, с обходом каталога :
Это переименует каждый файл на месте.
И ниже рабочий пример с распараллеливанием :
источник
find -type f -name "file*.p" | parallel 'ext="{}" ; mv -- {} ${ext:0:4}2503${ext:8}'
Если вы обнаружите, что часто делаете подобные вещи, посмотрите «rename.pl». Это скрипт на perl, но он позволяет вам просто передавать ему код perl (например, как выражение ///), и он будет выполнять массовое переименование на основе этого выражения или кода.
Здесь есть базовая версия: http://stackoverflow.org/wiki/Rename.pl, но есть и другие версии, плавающие в сети. Это было вокруг целую вечность и целую вечность.
источник