Próbuję zrozumieć różnicę między tymi dwa polecenia:

sudo find / -name .DS_Store -delete 

i

sudo find / -name ".DS_Store" -exec rm {} \; 

Zauważyłem, że . Dlaczego? Która z nich jest bezpieczniejsza / szybsza / lepsza? Używałem obu na moim Macbooku i wydaje się, że wszystko działa dobrze.

Odpowiedź

-delete będzie działać lepiej, ponieważ nie musi tworzyć zewnętrznego procesu dla każdego i każdy dopasowany plik.

Możliwe, że -exec rm {} \; często jest zalecane, ponieważ -delete nie istnieje w wszystkie wersje find. Nie mogę w tej chwili sprawdzić, ale jestem prawie pewien, że użyłem find bez niego.

B. inne metody powinny być „bezpieczne”.

EDYTUJ za komentarz z @doitmyway: upewnij się, że pasujesz w nazwie i następnie usuń, a nie odwrotnie (usuń, a następnie dopasuj). W przeciwnym razie każdy plik zostanie usunięty, niezależnie od tego, czy pasuje, czy nie . Tzn. NIE rób to: find / -delete -name .DS_Store.

Typową metodą unikania narzutu związanego z tworzeniem zewnętrznego procesu dla każdego dopasowanego pliku jest:

find / -name .DS_Store -print0 | xargs -0 rm 

(ale pamiętaj, że występuje tu również problem z przenośnością: nie wszystkie wersje find mają -print0!)

Komentarze

  • Widzę. ' przeczytałem też, że użycie przełącznika -delete przed -name usuwa określone drzewo plików więc chyba muszę być ostrożny.
  • Ostatnio find możesz użyć -exec rm {} +, aby usunąć wszystkie dopasowane pliki z pojedynczym poleceniem rm.
  • .DS_Store nie ' t zawierają jakiekolwiek znaki specjalne, więc cudzysłowy są niepotrzebne i nic nie zmieniają w tym przypadku.
  • Zasadniczo tylko białe spacje (spacje, tabulatory, może inne) są jedyną rzeczą, która powoduje, że niecytowany ciąg jest interpretowany jako dwa oddzielne argumenty wiersza poleceń, ale to ' to nie wszystko, za co musisz przepraszać, decydując, czy cytować, czy nie. Musisz się martwić o wszystkie metaznaki powłoki, takie jak ; lub | lub > lub < i „ i wiele innych, które mają specjalne znaczenie dla powłoki, chyba że są cytowane w cudzysłowie.
  • @MarcoMarsala xargs rozwiązuje problem z listą argumentów o ograniczonym rozmiarze w przejrzysty sposób, dzieląc go na wiele wywołań polecenia.

Odpowiedź

Zakładając, że .DS_Store reprezentuje pliki, a nie katalogi, najbardziej przenośnym i szybkim sposobem na zrobienie tego byłoby:

sudo find / -name .DS_Store -exec rm {} + 

Jedynym ryzykiem jest to, że sudo nie będzie dostępne, ale obecnie jest dość niskie.

-delete opcja używana do żądania znalezienia GNU i nadal jest niestandardowa w wielu innych implementacjach find, więc nie zawsze jest dostępna.

Zakończenie polecenia + in zamiast \; wysoce optymalizuje klauzulę exec, nie uruchamiając polecenia rm dla każdego i każde .DS_Store obecne w systemie plików.

Odpowiedź

W przypadku komputera takiego jako twój macbook nie znajdziesz dużej różnicy w wydajności między tymi dwoma poleceniami. Jeśli jednak spojrzysz na wersję -exec, zobaczysz subtelną różnicę:

sudo find / -iname ".file-to-delete" -exec rm {} \; 

Oznacza to, że znajdziesz wszystkie te pliki o nazwie „.file -usunąć”. Jednak to wyszukiwanie może zwrócić niechciane fałszywe alarmy. Robiąc coś z sudo, powinieneś być bardziej ostrożny. Zaletą użycia -exec rm {} jest to, że możesz przekazać argumenty do rm w następujący sposób:

sudo find / -iname "*~" -exec rm -i {} \; 

W tym przykładzie chcę usunąć te pliki kopii zapasowych, które emacs robi. Jednak ta tylda może znajdować się w jakimś nieznanym pliku, o którym nie wiem i może być ważny. Poza tym chcę potwierdzić usunięcie. Dlatego umieszczam opcję „-i” w poleceniu rm. To da mi interaktywne usuwanie .

Możesz również udoskonalić użycie rm do usuwania katalogów i plików:

find /usr/local/share/ -iname "useless" -exec rm -r {} \; 

Krótko mówiąc, -exec daje masz nieco większą kontrolę nad rzeczywistym poleceniem, które usuwa znaleziony element. Zaletą jest to, że używasz jednego narzędzia do znajdowania plików, a innego do ich usuwania.Ponadto nie każda wersja narzędzia find ma opcję -delete. Dlatego lepiej używać każdego narzędzia do jego właściwej pracy. To jest filozofia unixa – jedno narzędzie, jedno zadanie, używaj ich razem, aby robić to, co musisz.

Komentarze

  • Zobacz także -ok rm {} \; zamiast -exec rm {} \; do interaktywnego potwierdzenia.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *