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
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.
-delete
przed-name
usuwa określone drzewo plików więc chyba muszę być ostrożny.find
możesz użyć-exec rm {} +
, aby usunąć wszystkie dopasowane pliki z pojedynczym poleceniemrm
..DS_Store
nie ' t zawierają jakiekolwiek znaki specjalne, więc cudzysłowy są niepotrzebne i nic nie zmieniają w tym przypadku.;
lub|
lub>
lub<
i „ i wiele innych, które mają specjalne znaczenie dla powłoki, chyba że są cytowane w cudzysłowie.xargs
rozwiązuje problem z listą argumentów o ograniczonym rozmiarze w przejrzysty sposób, dzieląc go na wiele wywołań polecenia.