Możliwe duplikaty:
Jak usunąć wszystkie pliki w katalogu oprócz niektórych?
Jak usunąć wszystkie pliki oprócz jednego (lub niektórych) w Uniksie?
Coś jak
rm -rf -ignore myfile.txt *
Możliwe duplikaty:
Jak usunąć wszystkie pliki w katalogu oprócz niektórych?
Jak usunąć wszystkie pliki oprócz jednego (lub niektórych) w Uniksie?
Coś jak
rm -rf -ignore myfile.txt *
ls * | grep -v dont_delete_this_file | xargs rm -rf
Przykład:
mkdir test && cd test
touch test1
touch test2
touch test3
touch test4
touch test5
Aby usunąć wszystkie pliki oprócz „test2”:
ls * | grep -v test2 | xargs rm -rf
Zatem wyjściem „ls” jest:
test2
EDYTOWAĆ:
Dziękuję za komentarz. Jeśli katalog zawiera niektóre pliki ze spacjami:
mkdir test && cd test
touch "test 1"
touch "test 2"
touch "test 3"
touch "test 4"
touch "test 5"
Możesz użyć (z bash):
rm !("test 1"|"test 4")
Wyjście „ls”:
test 1
test 4
ls -1 | grep -v do_not_delete | xargs -I files rm "files"
Zakładając, że używasz powłoki bash (najczęstszy przypadek), możesz użyć symbolu globowania negacji (rozwinięcia nazwy ścieżki):
Używa to rozszerzonego globowania, więc najpierw musisz włączyć:
źródło
źródło
źródło
Ta strona daje różne opcje w zależności od powłoki: http://www.unix.com/unix-dummies-questions-answers/51400-how-remove-all-except-one-file.html
źródło
W przypadku rekurencji
rm
należy wykonać rekursjęfind
i wykluczyć pliki, które chcesz zachować (lubgrep
, ale może to spowodować problemy z białymi znakami). W przypadku globu powłoki współczesne powłoki mają wzorce globu, których można użyć do wykluczenia plików; można to połączyć z rekurencją globalną na poziomie powłoki, jeśli jest dostępna (np.zsh
marm **/*~foo/bar
- pamiętaj, że może to prowadzić do ograniczenia długości argumentów dla dużych drzew katalogów).źródło