Wyszukiwanie w witrynie

3 sposoby usunięcia wszystkich plików w katalogu z wyjątkiem jednego lub kilku plików z rozszerzeniami


Czasami dochodzi do sytuacji, w której trzeba usunąć wszystkie pliki w katalogu lub po prostu oczyścić katalog, usuwając wszystkie pliki z wyjątkiem plików danego typu (kończących się określonym rozszerzeniem).

W tym artykule pokażemy, jak usunąć pliki z katalogu, z wyjątkiem niektórych rozszerzeń i typów plików, za pomocą poleceń rm, find i globignore.

Zanim przejdziemy dalej, zacznijmy od krótkiego spojrzenia na jedną ważną koncepcję w Linuksie – dopasowywanie wzorców nazw plików, które umożliwi nam uporanie się z naszym problemem.

Sugerowana lektura: Użyj polecenia find, aby przeszukać wiele nazw plików/rozszerzeń w systemie Linux

W systemie Linux wzór powłoki to ciąg składający się z następujących znaków specjalnych, nazywanych znakami wieloznacznymi lub metaznakami:

  1. * – dopasowuje zero lub więcej znaków
  2. ? – dopasowuje dowolny pojedynczy znak
  3. [seq] – dopasowuje dowolny znak w sekwencji
  4. [!seq] – dopasowuje dowolny znak spoza sekwencji

Istnieją trzy możliwe metody, które tutaj zbadamy, a obejmują one:

Usuń pliki za pomocą rozszerzonych operatorów dopasowywania wzorców

Poniżej wymieniono różne rozszerzone operatory dopasowywania wzorców, gdzie lista-wzorców to lista zawierająca jedną lub więcej nazw plików oddzielonych znakiem |:

  1. *(lista-wzorców) – dopasowuje zero lub więcej wystąpień określonych wzorców
  2. ?(lista-wzorców) – dopasowuje zero lub jedno wystąpienie określonych wzorców
  3. +(lista-wzorców) – dopasowuje jedno lub więcej wystąpień określonych wzorców
  4. @(lista-wzorców) – dopasowuje jeden z podanych wzorców
  5. !(lista-wzorców) – dopasowuje wszystko oprócz jednego z podanych wzorców

Aby z nich skorzystać, włącz opcję powłoki extglob w następujący sposób:

shopt -s extglob

1. Aby usunąć wszystkie pliki w katalogu oprócz nazwy pliku, wpisz poniższe polecenie:

rm -v !("filename")

2. Aby usunąć wszystkie pliki z wyjątkiem nazwa pliku1 i nazwa pliku2:

rm -v !("filename1"|"filename2") 

3. Poniższy przykład pokazuje, jak interaktywnie usunąć wszystkie pliki inne niż wszystkie pliki .zip:

rm -i !(*.zip)

4. Następnie możesz usunąć wszystkie pliki w katalogu oprócz wszystkich plików .zip i .odt w następujący sposób, jednocześnie wyświetlając to, co jest zrobione:

rm -v !(*.zip|*.odt)

Kiedy już będziesz mieć wszystkie wymagane polecenia, wyłącz opcję powłoki extglob w następujący sposób:

shopt -u extglob

Usuń pliki za pomocą polecenia find w systemie Linux

W ramach tej metody możemy użyć polecenia find wyłącznie z odpowiednimi opcjami lub w połączeniu z poleceniem xargs, wykorzystując potok jak w poniższych formularzach:

find /directory/ -type f -not -name 'PATTERN' -delete
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}

5. Poniższe polecenie usunie wszystkie pliki oprócz plików .gz w bieżącym katalogu:

find . -type f -not -name '*.gz'-delete

6. Używając potoku i xargs, możesz zmodyfikować powyższy przypadek w następujący sposób:

find . -type f -not -name '*gz' -print0 | xargs -0  -I {} rm -v {}

7. Spójrzmy na jeden dodatkowy przykład. Poniższe polecenie usunie wszystkie pliki z wyjątkiem .gz, .odt i .jpg w bieżącym katalogu:

find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete

Usuń pliki za pomocą zmiennej Bash GLOBIGNORE

To ostatnie podejście działa jednak tylko z bashem. Tutaj zmienna GLOBIGNORE przechowuje rozdzieloną dwukropkami listę wzorców (nazwy plików), które mają być ignorowane przy rozwijaniu nazw ścieżek.

Sugerowana lektura: Przydatne 12 praktycznych przykładów dotyczących polecenia Grep w systemie Linux

Aby zastosować tę metodę, przejdź do katalogu, który chcesz wyczyścić, a następnie ustaw zmienną GLOBIGNORE w następujący sposób:

cd test
GLOBIGNORE=*.odt:*.iso:*.txt

W tym przypadku wszystkie pliki inne niż .odt, .iso i .txt zostaną usunięte z bieżącego katalogu.

Teraz uruchom polecenie, aby wyczyścić katalog:

rm -v *

Następnie wyłącz zmienną GLOBIGNORE:

unset GLOBIGNORE

Uwaga: aby zrozumieć znaczenie flag użytych w powyższych poleceniach, zapoznaj się ze stronami podręcznika każdego polecenia, które wykorzystaliśmy na różnych ilustracjach.

To wszystko! Jeśli masz na myśli inne techniki wiersza poleceń służące do tego samego celu, nie zapomnij podzielić się z nami za pośrednictwem sekcji opinii poniżej.