В терминале 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