cd <the directory you want>
find . -type f ! -iname "*.pdf" -delete
- Первая команда приведет вас в каталог, в котором вы хотите удалить свои файлы
- Вторая команда удалит все файлы, кроме тех, которые заканчиваются
.pdf
на имя файла
Например, если temp
в вашей домашней папке есть каталог:
cd ~/temp
затем удалите файлы:
find . -type f ! -iname "*.pdf" -delete
Это удалит все файлы, кроме xyz.pdf
.
Вы можете объединить эти две команды для:
find ~/temp -type f ! -iname "*.pdf" -delete
.
это текущий каталог. !
означает взять все файлы, кроме тех, которые .pdf
в конце. -type f
выбирает только файлы, а не каталоги. -delete
значит удалить это.
ПРИМЕЧАНИЕ: эта команда удалит все файлы (кроме файлов pdf, но включая скрытые файлы) в текущем каталоге, а также во всех подкаталогах. !
должен прийти раньше -name
. просто -name
включит только .pdf
, пока -iname
включит .pdf
и.PDF
Чтобы удалить только в текущем каталоге, а не в подкаталогах, добавьте -maxdepth 1
:
find . -maxdepth 1 -type f ! -iname "*.pdf" -delete
Эдвард Торвальдс
источник
.
значит "а"?!
означает «кроме»-name
означает, что вы хотите исключить с помощью параметра имени, а затем какое-delete
действие предпринять при поиске? Так он ищет все, кроме "* .pdf" и удаляет их? Или я неправильно понял?.
означает текущий каталог.!
означает взять все файлы, кроме того, что.pdf
в конце.-delete
значит удалить это. я теперь ясно?-maxdepth 1
параметр для начала. Затем предложите удалить параметр в случае, если вы хотите удалить рекурсивно.-iname
вместо них-name
, иначе.PDF
будут проскакивать файлы с расширением.С
bash
«s расширенной подстановкой оболочки, вы можете удалить любые файлы с другими расширениями , чем с.pdf
помощьюКак отмечает @pts,
--
символы указывают на конец любых параметров команды, что делает команду безопасной в редких случаях файлов, имена которых начинаются с-
символа.Если вы хотите удалить файлы без каких-либо расширений, а также файлы с расширениями, отличными от
.pdf
, то, как указано @DennisWilliamson, вы можете использоватьРасширенное глобирование должно быть включено по умолчанию, но если нет, вы можете сделать это, используя
Особенно, если вы намереваетесь использовать это внутри скрипта, важно отметить, что если выражение не совпадает с чем-либо (то есть, если в каталоге нет файлов, не относящихся к pdf), то по умолчанию глобус будет передаваться без расширения.
rm
команда, приводящая к ошибке вродеВы можете изменить это поведение по умолчанию, используя
nullglob
опцию оболочки, однако это имеет свою проблему. Для более подробного обсуждения смотрите NullGlob - Wiki Грегаисточник
rm *~*.pdf
!(*.py)
. Также, предположительно, если OP хочет, чтобы оставались только файлы «.pdf», то файлы без расширений также должны быть удалены и не игнорироваться.Удалить в корзину :
Или с помощью
mv
команды (но таким образом вы не можете восстановить его из корзины, так как он не записывает информацию .trashinfo, так что это означает, что вы переместили ваши файлы в место назначения , как указано ниже).источник
rm
.Самый простой подход: создать другой каталог где-нибудь (если вы удаляете только один каталог, а не рекурсивно, это может быть даже подкаталог); переместить все .pdf туда; удалить все остальное; переместить PDF обратно; удалить промежуточный каталог.
Быстро, просто, вы точно видите, что делаете. Просто убедитесь, что промежуточный каталог находится на том же устройстве, что и каталог, который вы очищаете, чтобы перемещения были переименованиями, а не копиями!
источник
Используйте GLOBIGNORE от bash:
Со страницы руководства bash:
Быстрый тест:
Выход:
источник
Будьте осторожны и составьте: используйте Xargs
Вот подход, который мне нравится, потому что он позволяет мне быть очень осторожным: придумать способ показать только те файлы, которые я хочу удалить, а затем отправить их в
rm
использованиеxargs
. Например:ls
показывает мне всеls | grep pdf
показывает мне файлы, которые я хочу сохранить. Хм.ls | grep -v pdf
показывает обратное: все, кроме того, что я хочу сохранить. Другими словами, он показывает список вещей, которые я хочу удалить. Я могу подтвердить это, прежде чем делать что-то опасное.ls | grep -v pdf | xargs rm
отправляет именно этот списокrm
для удаленияКак я уже сказал, мне в основном нравится это за безопасность, которую он обеспечивает: не случайно
rm *
для меня. Два других преимущества:ls
или,find
чтобы получить первоначальный список, как вы предпочитаете. Вы можете использовать все что угодно в процессе сужения этого списка - другоеgrep
, какое-тоawk
или что-то еще. Если вам нужно было удалить только файлы, имена которых содержат цвет, вы можете создать его таким же образом.find
для поиска иrm
удаления, в отличие от необходимости помнить, чтоfind
принимает-delete
флаг. И если вы сделаете это, опять же, вы можете составить альтернативные решения; может быть, вместоrm
, вы могли бы создатьtrash
команду, которая перемещает файл в корзину (разрешает «удаление») и направляет к нему вместоrm
. Вам не нужноfind
поддерживать эту опцию, вы просто передаете ее.Обновить
См. Комментарии @pabouk, чтобы узнать, как изменить это для обработки некоторых крайних случаев, таких как разрывы строк в именах файлов, имена файлов, например
my_pdfs.zip
, и т. Д.источник
pdf
где-либо его имя. --- b) Он удалит файлы PDF, если любая из букв в суффиксе будет прописной. --- в) Не рекомендуется использовать выводls
. Он не будет работать с именами файлов, содержащими переводы строк. Некоторые реализацииls
заменяют специальные символы, например tab?
. --- Лучше использования:find -maxdepth 1 -print0
. (не так коротко, какls
:) ----- Для разрешения а) и б) используйтеgrep -vi '\.pdf$'
--- полное (но только для GNU) решение:find -maxdepth 1 -print0 | grep -viz '\.pdf$' | xargs -0 rm
| head -20
хотя бы посмотреть, выглядит ли это примерно правильно, а если вы простоrm my_pattern
, у вас нет шансов обнаружить большую ошибку.find . -type f ! -name "*.pdf"
для печати на консоль, или для передачи на less или в файл. [и затем направьте xargs к rm, если хотите, как комментарии Пабука (с -print0 | ... -0 для странных имен файлов)]Обычно я решаю такие проблемы с помощью интерактивного интерпретатора Python:
Он может быть длиннее однострочного с
find
илиxargs
, но он чрезвычайно устойчив, и я точно знаю, что он делает, без предварительного исследования.источник
for item in [f for f in os.listdir('.') if not f.endswith('.pdf')]: os.remove(item)
python -c "import os; for f in os.listdir('.'): if not f.endswith('.pdf'): os.remove(f)"
[os.remove(f) for f in os.listdir('.') if not f.endswith('.pdf')]
Лучшим ответом (по сравнению с моим предыдущим ответом) на этот вопрос будет использование мощной
file
команды.Теперь ваша проблема:
Задача
for
команды - передать файлы в текущем каталоге в виде переменной$var
.if-then
Команда выводит имена файлов pdf, принимая статус выхода команды0
fromfile -i "$var" | grep -q 'application/pdf\;'
, она выдаст статус выхода,0
только если найдет файлы pdf.источник
Предупреждение! Лучше попробуй первым
источник
-i
сgrep
для сопоставления без учета регистра.Читать как, удалить все файлы, которые не являются
a.pdf
илиx.pdf
.Это работает, используя 2 расширенных глоба, внешний
!()
для отмены содержащегося глобуса, который сам по себе требует, чтобы шар соответствовал одному или нескольким изa
илиx
шаблонам перед.pdf
суффиксом. Смотрите glob # extglob .источник
портативный способ оболочки
Довольно много POSIX и совместим с любой оболочкой Bourne стиля (
ksh
,bash
,dash
). Хорошо подходит для переносимых сценариев и когда вы не можете использоватьbash
расширенную глобализацию оболочки.Perl:
Или немного чище:
альтернативный питон
источник
Будьте осторожны с тем, что вы удаляете!
Безопасный способ проверить его перед попыткой удаления - это сначала выполнить тестирование
ls
, поскольку некоторые необработанные действия могут удалить ненужные файлы. И вы можете сделать это прямо за пределами каталога.ls
похожеrm
, так:Это будет список
И теперь вы можете видеть, что вы удаляете и можете безопасно удалить их:
Вот и все. Йо может использовать подстановочный знак,
*
чтобы быть более избирательным, например, хранить только документы курса:источник