mv
это не правильный инструмент.
Вы должны использовать rename
команду:
rename 's/\./_/' *.*.txt
Строка 's/\./_/'
означает «заменить первое вхождение .
a _
на список файлов фолдинга».
У меня есть некоторые файлы, которые я получаю с именами вроде (для многих, чтобы делать это каждый день вручную):
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
Как мне сопоставить шаблон с тем, что я хочу?
mv
это не правильный инструмент.
Вы должны использовать rename
команду:
rename 's/\./_/' *.*.txt
Строка 's/\./_/'
означает «заменить первое вхождение .
a _
на список файлов фолдинга».
У команды mv может быть только одна цель: либо переименование одного файла (например, mv AA.B.txt AA_B.txt), либо перемещение набора файлов и каталогов в каталог (например, mv . .Txt newdir ). Если вы хотите переименовать файл, вам нужно делать это по одному. Итак, какая-то петля.
Попробуйте что-то вроде следующего:
for f in *.*.txt; do mv $ $(echo $ | sed -e 's#\.#_#') done
Команда sed заменяет только первую найденную точку подчеркиванием. Любые оставшиеся точки остаются нетронутыми.
Надеюсь это поможет.