Я хочу удалить все файлы в каталоге, оставив только некоторые указанные файлы, они не имеют ничего общего по имени. Как я мог этого достичь?
Например, имена файлов, которые я хочу сохранить:
file_1.png
, another_file.jpg
,some_music.mp3
Я хочу удалить все файлы в каталоге, оставив только некоторые указанные файлы, они не имеют ничего общего по имени. Как я мог этого достичь?
Например, имена файлов, которые я хочу сохранить:
file_1.png
, another_file.jpg
,some_music.mp3
Ответы:
Если вы используете Bash:
shopt -s extglob
rm -- !(file1|file2|file3)
Первая строка просто активирует расширенное сопоставление с образцом, и после этого мы используем один из них:
!(pattern-list)
соответствует чему-либо, кроме одного из данных шаблонов
и список шаблонов представляет собой список из одного или нескольких шаблонов, разделенных символом |
.
Или с zsh
setopt extendedglob
rm -- ^(file1|file2)
Или, более портативный, используя find
:
find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +
Создайте подкаталог tmp
, переместите все файлы, которые вы хотите сохранить, в этот каталог и сделайте rm -f *
потом. Это не повлияет на tmp
каталог.
После этого просто сделайте:
mv tmp/* .
rmdir tmp
(Предполагается, что ни один из перемещенных файлов не начинается с точки).
Это один из немногих случаев, когда имеет смысл использовать мышь и файловый браузер, такой как Nautilus, где вы можете Ctrlщелкнуть несколько файлов, которые хотите сохранить, и затем использовать меню: Edit -> Invert Selection
получить другие файлы и затем удалить их. ,
ls
чтобы увидеть, не пропустили ли вы какие-либо файлы, которые хотите сохранить.
Добавьте имена файлов, которые вы хотите сохранить, в текстовый файл, по одному в строке. Этот файл не должен быть в каталоге, или вы должны добавить его имя тоже.
Если имя вашего каталога foo, а имя файла - bar , сделайте следующее.
find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm
Это делает следующее:
find -type f
ищет имена всех файлов в foo и его подкаталогах и печатает их в STDOUT. С опцией -print0
он разделяет имена файлов с байтами NUL.grep -v -f bar
исключает все имена файлов, которые соответствуют строке в строке . С опцией -z
он обрабатывает свои входные данные как набор строк, разделенных байтом NUL, с опцией -Z
он ограничивает свой вывод байтом NUL.xargs rm
звонит rm
несколько раз, чтобы удалить файлы. С параметром -0
он обрабатывает свой ввод как набор строк, разделенных байтом NUL.Это работает с именами файлов, содержащими пробелы.
find
я бы предпочелfind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
shopt -u extglob
).