В терминале Linux, как удалить все файлы в каталоге, кроме одного или двух
В терминале Linux, как удалить все файлы из папки, кроме одного или двух?
Например.
У меня есть 100 файлов изображений в каталоге и один .txt
.
Я хочу удалить все файлы, кроме файла .txt
.
Ответы
Ответ 1
Внутри каталога укажите файлы, отфильтруйте все, не содержащие "file-to-keep", и удалите все файлы, оставшиеся в списке.
ls | grep -v 'file-to-keep' | xargs rm
Чтобы избежать проблем с пробелами в именах файлов (не забудьте использовать пробелы в именах файлов), используйте опции find
и -0
.
find 'path' -maxdepth 1 -not -name 'file-to-keep' -print0 | xargs -0 rm
Или смешайте оба варианта, используйте grep
вариант -z
для управления именами -print0
от find
Ответ 2
В общем, использование поиска в инвертированном шаблоне с помощью grep должно выполнять эту работу. Поскольку вы не определили какой-либо шаблон, я бы просто дал вам общий пример кода:
ls -1 | grep -v 'name_of_file_to_keep.txt' | xargs rm -f
ls -1
перечисляет один файл на строку, так что grep может искать строки за строкой. grep -v
- это инвертированный флаг. Таким образом, любой сопоставленный шаблон НЕ будет удален.
Для нескольких файлов вы можете использовать egrep:
ls -1 | grep -E -v 'not_file1.txt|not_file2.txt' | xargs rm -f
Обновление после вопроса обновлено:
Я предполагаю, что вы готовы удалить все файлы, кроме файлов в текущей папке, которые не заканчиваются на .txt
. Так что это тоже должно работать:
find . -maxdepth 1 -type f -not -name "*.txt" -exec rm -f {} \;
Ответ 3
find поддерживает параметр -delete
, поэтому вам не нужно -exec
. Вы также можете передать несколько наборов -not -name somefile -not -name otherfile
[email protected]$ ls
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt josh.pdf keepme
[email protected]$ find . -maxdepth 1 -type f -not -name keepme -not -name 8.txt -delete
[email protected]$ ls
8.txt keepme
Ответ 4
Используйте модификатор not
для удаления file(s)
или pattern(s)
, который вы не хотите удалять, вы можете изменить 1
, переданный в -maxdepth
, чтобы указать, сколько поддиректорий вам нужно удалить, чтобы удалить файлы от
find . -maxdepth 1 -not -name "*.txt" -exec rm -f {} \;
Вы также можете сделать:
find -maxdepth 1 \! -name "*.txt" -exec rm -f {} \;
Ответ 5
В bash вы можете использовать:
$ shopt -s extglob # Enable extended pattern matching features
$ rm !(*.txt) # Delete all files except .txt files