2014-02-14 3 views
14

В терминале Linux, как удалить все файлы из папки, кроме одного или двух?В терминале Linux, как удалить все файлы в каталоге, кроме одного или двух

Например.

У меня есть файлы изображений в каталоге и один .txt файл. Я хочу удалить все файлы, кроме .txt файл.

+0

, за исключением которых один или два? –

+0

Вам лучше показать, как выглядят исключения. В противном случае мы сможем дать очень общий ответ. – fedorqui

+0

обновленный вопрос – Bilal

ответ

31

Из каталога, укажите файлы, отфильтруйте все, не содержащие «файл для хранения», и удалите все файлы, оставшиеся в списке.

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

+0

Это может быть проблематично, если в именах файлов есть пробелы. –

+0

Работы. Я должен быть в текущем каталоге, чтобы успешно выполнить эту команду. правильно? – Bilal

+0

Я пробовал эту команду как 'sudo ls directory/directory/directory1/| grep -v 'readme.txt' | xargs rm', но не работает. Мне нужно запустить эту команду во многих каталогах. Предположим, что у '' directory' есть siblings 'directory2, directory3'. – Bilal

8

В общем, с использованием инвертированного поиска шаблона с Grep должен делать эту работу. Как вы не определили какой-либо узор, я бы просто дать вам общий пример кода:

ls -1 | grep -v 'name_of_file_to_keep.txt' | xargs rm -f 

В ls -1 списки по одному файлу в строке, так что Grep можно найти построчно. grep -v - это инвертированный флаг. Таким образом, любая подобранная модель НЕ будет удалена.

Для нескольких файлов, вы можете использовать задать расширенный:

ls -1 | grep -E -v 'not_file1.txt|not_file2.txt' | xargs rm -f 

Update после вопроса был обновлен: Я предполагаю, что вы готовы, чтобы удалить все файлы, кроме файлов в текущей папке, которые не заканчиваются .txt , Так что это должно работать также:

find . -maxdepth 1 -type f -not -name "*.txt" -exec rm -f {} \; 
+0

эпос. чистый ответ. Спасибо. – moeiscool

3

Используйте модификатор not для удаления file(s) или pattern(s) вы не хотите удалить, вы можете модифицировать 1 передается -maxdepth указать, сколько подкаталогов глубоко вы хотите удалить файлы от

find . -maxdepth 1 -not -name "*.txt" -exec rm -f {} \; 

Вы также можете сделать:

find -maxdepth 1 \! -name "*.txt" -exec rm -f {} \; 
4

находка поддерживает -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 
2

В Баш, вы можете использовать:

$ shopt -s extglob # Enable extended pattern matching features  
$ rm !(*.txt)  # Delete all files except .txt files 
Смежные вопросы