Назад | Перейти на главную страницу

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

Например, я хочу удалить все файлы в каталоге, кроме .tar файл, откуда они пришли. Я мог бы сделать что-то вроде:

find . -maxdepth 0 | grep -v '.tar$' | xargs rm -f

но есть ли способ сделать это, просто используя rm и сопоставление с образцом оболочки? Не стесняйтесь указывать его, используя bash или другие общедоступные оболочки, или с расширенными опциями, если это невозможно сделать с ванилью sh.

Я нашел аналогичный вопрос о избегая каталогов и подкаталогов с помощью find, но не с шаблонами оболочки.

Вы можете сделать это с помощью расширенных глобусов.

shopt -s extglob

затем

rm !(file.tar)

Это работает как минимум в bash 3.2.39

Я не думаю, что то, чего вы хотите достичь, возможно.

Однако вы можете упростить имеющуюся у вас команду:

find . -maxdepth 0 -not -name '*.tar' -exec rm -f {} +

Попробуйте это, возможно

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