Как я могу указать шаблон оболочки, который исключает определенные файлы?

Например, я хочу удалить все файлы в каталоге, кроме .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 {} +
Другие вопросы по тегам