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