Я хочу удалить все файлы в каталоге, оставив только некоторые указанные файлы, они не имеют ничего общего по имени. Как я мог этого достичь?
Например, имена файлов, которые я хочу сохранить:
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).