2015-04-17 1 views
2

Я хочу использовать «найти», чтобы переименовать кучу файлов, при этом переименование просто является удалением части расширения. Пример: abc.ext.DELAYED -> abc.extКак отрубить часть расширения файла с помощью find -exec

Я попытался следующие, но они просто не работают:

find . -name *.DELAYED -execdir mv {} $(echo {} | sed 's:\.DELAYED::') \; 
find . -name *.DELAYED -execdir mv {} $(echo {} | cut -f 1 -d".") \; 

ответ

0

Есть две проблемы с командами.

Первой проблемой является команда *. Вам нужно заключить его в строку, так как иначе bash расширяет его как выражение glob - * распространяется на все файлы в текущей папке.

Команда должна выглядеть следующим образом:

find . -name '*.DELAYED' ... 

Вторая проблема заключается в том, что команда замены произойдет перед тем команда получает казнили означает

$(echo {}) 

бы expaneded буквального {} будет приведет к команде, подобной

mv file1 file1 

Вы можете выполнить команду в оболочке вместо:

... -execdir bash -c 'mv {} $(echo {} | cut -f2 -d.)' \; 
+1

Это одна вещь. Но есть еще одна проблема - подстановка команды выполняется до запуска команды. –

+0

О! Не смотря на это! благодаря! Позвольте мне изменить это. – hek2mgl

1

Вы специально помечены этот вопрос с «Linux», поэтому я предполагаю, что ваш дистрибутив имеет инструмент переименования установлен, которое поставляется в Util-Linux пакет.

Это позволяет избежать проблем команды замещения и СЦЕПЛЕНИЕ несколько программ:

find . -name '*.DELAYED' -execdir rename .DELAYED '' {} \; 
+0

Да, использование 'rename' намного лучше, чем конструкция подстановки команд. – hek2mgl

Смежные вопросы