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