Как удалить все файлы, кроме одного именованного файла из определенной папки
Здесь ситуация.
У меня есть каталог, который содержит много файлов с различными расширениями. Я хочу удалить все файлы, кроме одного с определенным именем.
Это можно легко сделать с помощью графического интерфейса, выделив все и нажав 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 {} +
)