У меня есть файлы в каталоге. Имена файлов создаются с помощью нотации метки времени даты, имена файлов имеют форму:
name_YYMM.csv
Я хочу переименовать все такие файлы с помощью следующего соглашения о присвоении имен:
name_YYYYMM.csv
Я не уверен, могу ли я использовать утилиту командной строки как grep, чтобы сделать это, или если я должен записать сценарий удара, чтобы сделать это.
Любая справка о том, как решить этот prob, будет цениться.
Я работаю на Ubuntu
Очень простой способ сделать это
ls name* | while read a; do mv $a `echo $a | sed s/name_/name_20/`; done
или
ls name* | while read a; do mv $a $(echo $a | sed s/name_/name_20/); done
(так как использование одинарных левых кавычек обесценивается (или трудно читать так или иначе)),
это перечисляет все соответствие файлов name_
затем для каждого файла это находит, что заменяет name_
с name_20
. Можно измениться от 20 до 19, если Вы работаете с файлами с прошлого тысячелетия.
Вероятно, что у Вас есть программа или названный сценарий Perl rename
в Вашей системе.
Для версии сценария Perl:
rename 's/_/_20/' *_*.csv
Для util-linux-ng версии:
rename _ _20 *_*.csv
Или, использование Bash:
for f in name*; do mv "$f" "${f/_/_20}"; done
В zsh:
autoload zmv
zmv '(*_[0-9][0-9])([0-9][0-9].csv)' '${1}20${2}'
Можно сделать шаблон менее точным, например. '(*_??)(??.csv)'
или даже '(*)(??).csv'
если нет никакого риска другого соответствия файлов.
Если Вы не хотите использовать zsh, см. ответ Dennis Williamson.