Скажем, у меня есть каталог с большим количеством файлов с расширением .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