Удалить все файлы, кроме файлов с расширением pdf в каталоге

Удалить все файлы, кроме файлов с расширением pdf в каталоге

У меня есть каталог, содержащий следующее:

x.pdf
y.zip
z.mp3
a.pdf

Я хочу удалить все файлы, кроме x.pdfи a.pdf. Как это сделать из терминала? Подкаталогов нет, поэтому нет необходимости в рекурсии.

решение1

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

решение2

С помощью bashрасширенной подстановки оболочки вы можете удалить любые файлы с расширениями, отличными от .pdfиспользуемых

rm -- *.!(pdf)

Как отметил @pts, --символы обозначают конец любых параметров команды, что делает команду безопасной в редких случаях, когда имена файлов начинаются с -символа.

Если вы хотите удалить файлы без расширения, а также файлы с расширениями, отличными от .pdf, то, как указал @DennisWilliamson, вы можете использовать

rm -- !(*.pdf)

Расширенная подстановка должна быть включена по умолчанию, но если нет, вы можете сделать это с помощью

shopt -s extglob

Особенно если вы собираетесь использовать это внутри скрипта, важно отметить, что если выражение ничему не соответствует (т. е. если в каталоге нет файлов, отличных от PDF), то по умолчанию глоб будет передан команде неразвернутым rm, что приведет к ошибке типа

rm: cannot remove `*.!(pdf)': No such file or directory

Вы можете изменить это поведение по умолчанию с помощью nullglobопции shell, однако это имеет свою собственную проблему. Для более подробного обсуждения см.NullGlob - Вики Грега

решение3

Удалить в корзину:

$ cd <the directory you want>
$ gvfs-trash !(*.pdf)

Или с помощью mvкоманды (но таким образом вы не сможете восстановить его из корзины, так как он не записывает информацию .trashinfo, так что это означает, что вы переместили свои файлы вместо назначениягде это выглядит следующим образом).

mv !(*.pdf) ~/.local/share/Trash/files

решение4

Используйте GLOBIGNORE из bash:

GLOBIGNORE=x.pdf:a.pdf
rm *
unset GLOBIGNORE

Из страницы руководства bash:

ГЛОБИГНОРЕ:

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

Быстрый тест:

mkdir /tmp/foooooo
cd /tmp/foooooo
touch x.pdf y.zip z.mp3 a.pdf
GLOBIGNORE=x.pdf:a.pdf
ls -1 *

Выход:

y.zip
z.mp3

Связанный контент