2

У меня есть файлы в каталоге. Имена файлов составляются с использованием нотации даты и времени, имена файлов имеют вид:

name_YYMM.csv

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

name_YYYYMM.csv

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

Любая помощь о том, как решить эту проблему, будет оценена.

Я работаю на Ubuntu

3 ответа3

2

Очень простой способ сделать это

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, если вы работаете с файлами прошлого тысячелетия.

1

Вполне вероятно, что у вас есть программа или Perl-скрипт с именем rename в вашей системе.

Для версии сценария Perl :

rename 's/_/_20/' *_*.csv

Для версии util-linux-ng :

rename _ _20 *_*.csv

Или, используя Bash:

for f in name*; do mv "$f" "${f/_/_20}"; done
0

В зш:

autoload zmv
zmv '(*_[0-9][0-9])([0-9][0-9].csv)' '${1}20${2}'

Вы можете сделать шаблон менее точным, например '(*_??)(??.csv)' или даже '(*)(??).csv' если нет риска совпадения других файлов.

Если вы не хотите использовать zsh, посмотрите ответ Денниса Уильямсона.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .