На этот вопрос уже есть ответ здесь:
Вот ситуация .
У меня есть каталог, в котором много файлов с разными расширениями. Я хочу удалить все файлы, кроме одного с определенным именем.
Это можно легко сделать с помощью графического интерфейса пользователя, выбрав все, нажав ctrl и отменив выбор нужного файла.
Это именно то, что я хочу, но как я могу сделать это из командной строки?
Например: dirA содержит следующие файлы:
a.txt
b.txt
c.php
d.html
a.db
b.db
e.html
Я хочу удалить все файлы, оставив только файл с именем a.txt
.
Я шел с этой легкой простой большой командой:
rm !(a.txt)
можно использовать! как отрицание
Протестируйте шарик с эхом сначала т.е.
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
, Но Вы должны быть осторожными, потому что находят, что команда является рекурсивной.
Можно сделать это в терминале:
cd dirA
export GLOBIGNORE=a.txt
rm *
export GLOBIGNORE=
Можно использовать команду:
find ! -name 'a.txt' -type f -exec rm -f {} +
Это будет искать файлы (-type f
) в текущем каталоге за исключением файла a.txt
(! -name 'a.txt
) и затем удалит их (-exec rm -f {} +
)
Используйте 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
Для поиска в текущей папке используйте .
вместо 'папки'.