Как я могу указать шаблон оболочки, который исключает определенные файлы?
Например, я хочу удалить все файлы в каталоге, кроме .tar
файл, откуда они пришли. Я мог бы сделать что-то вроде:
find . -maxdepth 0 | grep -v '.tar$' | xargs rm -f
но есть ли способ сделать это просто использовать rm и сопоставление с образцом оболочки? Не стесняйтесь указывать это, используя bash
или другие общедоступные оболочки, или с расширенными опциями, если это не может быть сделано с ванилью sh
,
Я нашел похожий вопрос о том, как избегать каталогов и подкаталогов с помощью find, но не с шаблонами оболочки.
4 ответа
Вы можете сделать это с расширенной потертостью.
shopt -s extglob
затем
rm !(file.tar)
Это работает в Bash 3.2.39 как минимум
Попробуйте это возможно
find . -maxdepth 0 \! -name '*.tar' -exec echo rm -f {} \;
Удалите эхо, предшествующее rm, если оно выглядит правильно.
Да, но есть ли шаблон оболочки?
Я так не думаю. По крайней мере, в версиях bash, с которыми я знаком. Из других ответов видно, что более новые версии могут быть более функциональными.
Редактировать:
Прочитайте вопрос, чтобы быстро... Но в любом случае, чтобы продолжить мой пост...:-) Если вы хотите удалить все файлы, кроме tar-файлов, рекурсивно с zsh:
rm -rf **/^*.tar(.)
Нерекурсивна:
rm -rf ^*.tar(.)
Новый bash 4.0 и zsh поддерживают рекурсивное сглаживание. Чтобы включить его в bash, используйте:
shopt -s globstar
Это работает как:
rm -rf **/*.tar.gz
Я не думаю, что вы хотите достичь возможно.
Однако вы можете упростить имеющуюся команду:
find . -maxdepth 0 -not -name '*.tar' -exec rm -f {} +