Muszę usunąć wszystkie skompilowane dane:
- nazwane katalogi
build
, - nazwane katalogi
obj
, - * Pliki .so.
Napisałem polecenie
find \( -name build -o -name obj -o -name *.so \) -exec rm -rf {} \;
które rekursywnie przegląda wszystkie katalogi i usuwa wszystko, czego potrzebuję.
Dlaczego mam takie wyjście na końcu? Może powinienem napisać inne polecenie.
find: `./3/obj': No such file or directory
find: `./3/build': No such file or directory
find: `./1/obj': No such file or directory
find: `./1/build': No such file or directory
find: `./2/obj': No such file or directory
find: `./2/build': No such file or directory
find
tego wfind /search_directory options
taki sposób, że pominięcie katalogu wyszukiwania nie jest dobrym pomysłemOdpowiedzi:
Skorzystaj
-prune
z katalogów, które i tak chcesz usunąć, abyfind
nie zawracać sobie głowy próbą znalezienia w nich plików:Należy również zauważyć, że
*.so
należy go zacytować, ponieważ w przeciwnym razie powłoka może go rozwinąć do listy.so
plików w bieżącym katalogu.Odpowiednikiem twojego
-regex
typu GNU byłoby:Zauważ, że jeśli zamierzasz użyć składni specyficznej dla GNU, równie dobrze możesz użyć
-delete
zamiast-exec rm -rf {} +
. Za pomocą-delete
GNUfind
włącza się-depth
automatycznie. Nie uruchamia zewnętrznych poleceń, dzięki czemu jest bardziej wydajny, a także bezpieczniejszy, ponieważ usuwa warunki wyścigu, w których ktoś może sprawić, że usuniesz niewłaściwe pliki, zmieniając katalog na dowiązanie symboliczne między czasemfind
znajduje plik irm
usuwa go (zobaczinfo -f find -n 'Security Considerations for find'
szczegóły).źródło
-delete
lepiej radzi sobie również z takimi przestrzeniami-exec rm -rf {} +
które nie mają z nimi problemu.{}
- czy należy je cytować, czy nie? Wydaje się, że działa bez cudzysłowów, ale na przykład używa GNU Findutils Manual'{}'
. Czy mógłbyś wyjaśnić?csh
, ale nigdy nie mogłem zweryfikować tego twierdzenia. Nie są potrzebne w żadnej nowoczesnej powłoce, którą znam. Zdecydowanie nie są wymagane przez POSIX. Te przykłady POSIX z nich nie korzysta.-delete
nie można go używać z katalogami.Chyba dlatego, że
find
najpierw usuwa drzewo katalogów i próbuje sprawdzić zawartość katalogu, co oczywiście nie jest najlepszą możliwą kolejnością. Możesz wymusićfind
najpierw sprawdzenie zawartości:Należy rozważyć użycie
-delete
plików i-exec rmdir
katalogów.źródło
Moje rozwiązanie
+ vs \; w poleceniu -exec
źródło
-exec … {} +
wykonuje polecenie dla wielu plików jednocześnie, tyle ile zmieści się w linii poleceń. Jeśli plików jest zbyt wiele (a dokładniej, jeśli całkowita długość ścieżek jest zbyt długa),find
wykona wiele instancjirm
, a tym samym może skończyć się usunięciem katalogu, który przemierza. Jest to po prostu mniej prawdopodobne+
niż z;
, ale+
nie rozwiązuje problemu.