2011-01-15 2 views

ответ

14

Это будет включать в себя все подкаталоги:

find . -type f ! -iname '*.pdf' -delete 

Это будет действовать только в текущем каталоге:

find . -maxdepth 1 -type f ! -iname '*.pdf' -delete 
+2

это также удалит файлы без PDF в подкаталогах – Robokop

+0

@Robokop: исправлено. – Juliano

6
$ ls -1 | grep -v '.pdf$' | xargs -I {} rm -i {} 

Или, если вы уверены:

$ ls -1 | grep -v '.pdf$' | xargs -I {} rm {} 

Или пуленепробиваемый версия:

$ find . -maxdepth 1 -type f ! -iname '*.pdf' -delete 
+0

Это сработало! Спасибо за волшебство – xiamx

+3

Выход ls предназначен для отображения пользователю, а не разобранного. ls может заменить символ или переформатировать имена файлов, чтобы представить его пользователю. – Juliano

+1

'{}' или '" {} "' не имеет никакого отношения к оболочке, это единственный параметр, переданный команде – Juliano

-1
ls | grep -v '.pdf$' | xargs rm 

Это будет фильтровать все файлы, которые не заканчиваются PDF и выполнить RM на них

+1

У этого есть проблемы с пробелами ... –

+0

Хм, видимо, это так. Я никогда не замечал этого, спасибо, что указали это! – TyrantWave

+0

Это ужасно! ** Не используйте его: ** анализ вывода 'ls' - это действительно плохая практика, и он будет разбит во многих отношениях (имена файлов с пробелами или начинающиеся с дефиса). –

5

Это должно сделать трюк:

shopt -s extglob 
rm !(*.pdf) 
+0

Было бы даже лучше, если бы вы «ломались». –

Смежные вопросы