Як видалити всі файли, окрім одного, в Unix? [дублікат]


Відповіді:


20
ls * | grep -v dont_delete_this_file | xargs rm -rf 

Приклад:

mkdir test && cd test
touch test1
touch test2
touch test3
touch test4
touch test5

Щоб видалити всі файли, крім 'test2':

ls * | grep -v test2 | xargs rm -rf

Тоді 'ls' вихід:

test2

Редагувати:

Дякуємо за коментар Якщо каталог містить деякі файли з пробілами:

mkdir test && cd test
touch "test 1"
touch "test 2"
touch "test 3"
touch "test 4"
touch "test 5"

Ви можете використовувати (з bash):

rm !("test 1"|"test 4")

'ls' вихід:

test 1
test 4

Збирався зробити дуже схоже за допомогою пошуку, але ваші роботи і ви були швидшими. +1
Rory Alsop

2
це не вдається, якщо у вас є файли з пробілами в їх назвах.
Мат

Для обробки назви файлів з пробілами можна скористатисяls -1 | grep -v do_not_delete | xargs -I files rm "files"
sebhofer

8

Припускаючи, що ви використовуєте оболонку bash (найпоширеніший випадок), ви можете використовувати символ заперечення глобалізації (розширення імені шляху):

rm -rf !(myfile.txt)

Для цього використовується розширений глобус, тому вам потрібно спочатку ввімкнути це:

shopt -s extglob




0

Для рекурсивності rmвам потрібно буде виконати рекурсію з findта виключити файл (и), який ви хотіли зберегти (або grep, але це може спричинити проблеми з пробілами). Для глобуса оболонки сучасні оболонки мають шаблони глобулів, які можна використовувати для виключення файлів; це може поєднуватися з глобальною рекурсією на рівні оболонки, коли вона доступна (наприклад zsh, rm **/*~foo/barмайте на увазі, що це, ймовірно, може наштовхнутися на обмеження довжини аргументів для великих дерев каталогів).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.