Как удалить все файлы, кроме одного именованного файла из определенной папки

Здесь ситуация.

У меня есть каталог, который содержит много файлов с различными расширениями. Я хочу удалить все файлы, кроме одного с определенным именем.

Это можно легко сделать с помощью графического интерфейса, выделив все и нажав Ctrl и отменив выбор файла.

Это именно то, что я хочу, но как я могу это сделать из командной строки?

Например: dirA содержит следующие файлы:

a.txt
b.txt
c.php
d.html
a.db
b.db
e.html

Я хочу удалить все файлы, оставив только файл с именем a.txt,

5 ответов

Решение

Я пришел с этой простой простой великой командой:

rm !(a.txt)

ты можешь использовать! как отрицание

Сначала протестируйте шар с помощью echo, т.е.

echo !(a.txt)

Если это не работает, для bash вам может понадобиться включить это с

shopt -s extglob

Если вы хотите сохранить оба a.txt а также b.txt, ты можешь использовать !(a.txt|b.txt) или же !([ab].txt),

Редактировать:

делать rm работает рекурсивно просто добавить -r лайк

rm -r !(a.txt)

а также, он работает с папкой. просто нужно изменить имя на имя dir, например, для a_dir

rm -r !(a_dir)

Вы можете попробовать эту команду:

find . \! -name 'a.txt' -delete

Но вы должны быть осторожны, потому что команда find является рекурсивной.

Вы можете сделать это в терминале:

cd dirA 
export GLOBIGNORE=a.txt
rm *
export GLOBIGNORE=

Использование find а также xargs

find folder -type f -not -name 'a.txt' -print0 | xargs -0 rm

Чтобы исключить несколько вещей:

find folder -type f -not -name 'a.txt' -not -name 'b.txt' -print0 | xargs -0 rm

Это также работает с подстановочными знаками:

find folder -type f -not -name '*.png' -not -name 'b.txt' -print0  | xargs -0 rm

Для поиска в текущей папке используйте . вместо "папки".

Базовый источник

Вы можете использовать команду:

find ! -name 'a.txt' -type f -exec rm -f {} +

Это будет искать файлы (-type f) в текущем каталоге, кроме файла a.txt (! -name 'a.txt), а затем удалит их (-exec rm -f {} +)

Другие вопросы по тегам