1

У меня есть некоторые файлы, которые я получаю с именами вроде (для многих, чтобы делать это каждый день вручную):

AA.B.txt
WW.C.txt

и я хочу переименовать их в AA_B.txt и WW_C.txt чтобы существующий код SQL по-прежнему функционировал, как и ожидалось. В настоящее время эти файлы игнорируются из-за формата filename.letter.txt.

ls работает и показывает мне эти файлы:

$ ls -a *.*.txt
AA.B.txt*
ABR.A.txt*
ABR.B.txt*
ABR.C.txt*
ACT.A.txt*

Однако подобная команда mv не работает:

$ mv *.*.txt *_*.txt
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

Как мне сопоставить шаблон с тем, что я хочу?

2 ответа2

2

mv не правильный инструмент.

Вы должны использовать команду rename :

rename 's/\./_/' *.*.txt

Строка 's/\./_/' означает «заменить первое вхождение a . _ в списке файлов фоллинга».

2

У команды mv может быть только одна цель: либо переименование одного файла (например, mv AA.B.txt AA_B.txt), либо перемещение набора файлов и каталогов в каталог (например, mv ..Txt newdir). Если вы хотите переименовать файл, вам нужно делать это по одному. Итак, какая-то петля.

Попробуйте что-то вроде следующего:

for f in *.*.txt; do
    mv ${f} $(echo ${f} | sed -e 's#\.#_#')
done

Команда sed заменяет только первую найденную точку подчеркиванием. Любые оставшиеся точки остаются нетронутыми.

Надеюсь это поможет.

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