Скажем, у меня есть каталог с большим количеством файлов с расширением .bak, и я хочу удалить его из каждого. Какой самый простой способ сделать это? Я имею в виду команду, которая будет делать то, что можно ожидать от mv *.bak * .
2 ответа
С zmv
Zsh имеет zmv , который предлагает очень простой интерфейс для переименования (или копирования) файлов:
autoload zmv
zmv '(*).bak' '$1'
Каждая пара скобок содержит группу, к которой затем можно получить доступ с помощью $1 , $2 и т.д. Вот еще несколько примеров.
Другой способ сделать это с помощью zmv - использовать опцию -W , которая работает для простых задач переименования:
zmv -W '*.bak' '*'
Самый простой способ сделать zmv всегда доступным - это поместить оператор autoload zmv в ваш ~/.zshrc .
С Bash-синтаксисом
Если вы хотите использовать "простой" синтаксис Bash для работы со строками, это можно сделать следующим образом:
for f in *.bak; do mv -- "$f" "${f%.bak}"; done
С помощью инструмента rename
Существует инструмент rename , который доступен в некоторых Linux и в OS X через brew install rename.
rename 's/.bak$//' *
$ Необходим для захвата конца строки, а не частей в середине имен файлов, которые содержат .bak .
В дополнение к полученным точным ответам, существует также очень старомодный способ, который должен работать в любой POSIX-совместимой системе - даже без современной оболочки, такой как bash или zsh:
for f in *.bak; do mv $f `echo $f | sed -e 's/\.bak$//'`; done
