У меня есть много файлов, которые имеют странное имя. Например, 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
. Есть ли способ, которым я могу это сделать?как шаблон заменить результат из команды оболочки, переданной в другую команду оболочки
ответ
Там существует инструмент для этого случая использования: 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
Обязательное предупреждение: есть два инструмента под названием 'rename', и только один из них поддерживает этот синтаксис. –
@lesmana Спасибо за информацию о переименовании инструмента. Я не знал об этом. Но мне трудно заставить его работать, мое требование по-прежнему переименовывать файлы, но файлы по-разному называются. Я хочу переименовать 'file_5_6.s' в' file_5_a32.s', я попробовал вариацию этого 'rename -v '/ _ \ d + \. s $/_ a32 \ .s/'* .s ', но доза не работает, она не вносит изменений в файл. Что-то не так с регулярным выражением, которое я использую. что может быть не так с этим? – Gautam
@UlrichSchwarz Как узнать, что является инструментом переименования, который я проверил на странице man для переименования на моем компьютере, доза не упоминает регулярное выражение, доза означает, что упомянутый синтаксис не будет работать? – Gautam