2015-02-07 3 views
0

У меня есть много файлов, которые имеют странное имя. Например, file_1_0_a32.elf , file_2_1_a32.elf, file_3_2_a32.elf в каталоге. Я хочу переименовать файлы в новое имя, удалив _1_a32 в файле file_2_1_a32.elf, поэтому имя будет file_2.elf. Я могу легко написать файл со списком файлов и новыми именами с помощью mv и выполнить файл. Мне было интересно, могу ли я сделать это с помощью самой командной строки. Я надеялся, что команда xargs может быть полезна здесь. Это все, что я мог придумать ls *.elf | xargs -i mv {} modifiedFileName. Я не знаю, как это сделать. В принципе, я хочу иметь еще один этап для исправления имен файлов, возвращаемых ls, а также сохранить исходное имя, чтобы я мог использовать его в качестве аргумента для mv. Есть ли способ, которым я могу это сделать?как шаблон заменить результат из команды оболочки, переданной в другую команду оболочки

ответ

1

Там существует инструмент для этого случая использования: rename

rename 's/_\d_a32//' *.elf 

xargs случая использования использовать водопроводное значение, как есть. Если вы хотите изменить значение канала и иметь исходное значение, то xargs не подходит для работы. В таком случае лучше использовать петлю while read в сочетании с поиском и заменой в расширении параметра bash.

ls *.elf | while read -r filename 
do 
    mv "$filename" "${filename/_?_a32}" 
done 

Для получения дополнительной информации о поиске и замена в расширении параметров Баша: http://wiki.bash-hackers.org/syntax/pe#search_and_replace

Учтите, что это приведет к перезаписи, не спрашивая: file_1_0_a32.elf и file_1_1_a32.elf оба будут переименованы в file_1.elf с одним перезаписаны. Он заменяет шаблон только в том случае, если число между подчеркиваниями однозначное (заменено: _3_a32, не заменено: _13_a32). Он также заменяет шаблон, если любой символ находится между символами подчеркивания (заменен: _x_a32). К сожалению, нет простого способа обойти это ограничение без использования другого инструмента вообще (подсказка: rename - хороший инструмент для этого варианта использования).

Инструмент rename иногда называют prename (perl rename) и часто устанавливается как часть пакета perl. Вот справочная страница в ubuntu: http://manpages.ubuntu.com/manpages/trusty/man1/prename.1.html

+0

Обязательное предупреждение: есть два инструмента под названием 'rename', и только один из них поддерживает этот синтаксис. –

+0

@lesmana Спасибо за информацию о переименовании инструмента. Я не знал об этом. Но мне трудно заставить его работать, мое требование по-прежнему переименовывать файлы, но файлы по-разному называются. Я хочу переименовать 'file_5_6.s' в' file_5_a32.s', я попробовал вариацию этого 'rename -v '/ _ \ d + \. s $/_ a32 \ .s/'* .s ', но доза не работает, она не вносит изменений в файл. Что-то не так с регулярным выражением, которое я использую. что может быть не так с этим? – Gautam

+0

@UlrichSchwarz Как узнать, что является инструментом переименования, который я проверил на странице man для переименования на моем компьютере, доза не упоминает регулярное выражение, доза означает, что упомянутый синтаксис не будет работать? – Gautam