mv файлы с несколькими `.` в имени файла

271
Jason

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

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 

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

1
Примечание: в `mv *. *. Txt * _ *. Txt` часть` *. *. Txt` ведет себя так же, как в `echo *. *. Txt`; часть `* _ *. txt` ведет себя как в` echo * _ *. txt`. Не существует логической связи между первой звездочкой и третьей, а также между второй и четвертой. Kamil Maciorowski 5 лет назад 0

2 ответа на вопрос

2
Mr Shunz

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

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

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

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

Ой. Я не знал о команде переименования. Очень хорошо. Lewis M 5 лет назад 0
Вот это да. Установил `переименовать` и это сработало отлично. Теперь читать `переименовать человека`. Огромное спасибо. Jason 5 лет назад 0
2
Lewis M

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

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

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

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

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

Похожие вопросы