Wydaję następujące polecenie, aby znaleźć katalogi .svn:
find . -name ".svn"
To daje mi następujące wyniki:
./toto/.svn
./toto/titi/.svn
./toto/tata/.svn
Jak mogę przetworzyć wszystkie te wiersze rm -fr
, aby usunąć katalogi i ich zawartość?
find
rm
subversion
Arnaud
źródło
źródło
-delete
opcję.-exec rm -r "{}" \;
na końcu znaleziska - zachowaj ostrożność podczas używaniarm -r
! :)-name ".svn"
, pasuje tylko do.svn
samego katalogu, a nie do plików znajdujących się w.svn
katalogu.-exec
cudzysłowu"{}"
).Odpowiedzi:
Znajdź może wykonywać argumenty z
-exec
opcją dla każdego znalezionego dopasowania. Jest to zalecany mechanizm, ponieważ można poprawnie obsługiwać ścieżki ze spacjami / znakami nowej linii i innymi znakami. Będziesz musiał usunąć zawartość katalogu, zanim będziesz mógł usunąć sam katalog, więc użyj-r
tegorm
polecenia, aby to osiągnąć.Na przykład możesz wydać:
Możesz także powiedzieć find, aby po prostu znalazł katalogi o nazwie .svn, dodając znacznik
-type d
:Ostrzeżenie Używaj
rm -r
ostrożnie, ponieważ usuwa folder i całą jego zawartość.Jeśli chcesz usunąć tylko puste katalogi, a także katalogi, które zawierają tylko puste katalogi, znaleźć można zrobić sobie z
-delete
i-empty
:źródło
-type
po-name
poleceń znalezienia, ponieważ wywołaniastat
aby uzyskać typu są drogie. Właśnie wypróbowałem to na dość dużej grupie plików i wydaje się to prawdą: uruchomieniefind . -name 'foo' -type d
zajęło 19 sekund, podczas gdyfind . -type d -name 'foo'
zajęło 32 sekundy. Więc o 50% dłuższy czas na uruchomienie-type
.find
chce zobaczyć w tym folderze inne dopasowania, jednocześnie usuwając folder w tym samym czasie. ~ Nie wiem jeszcze, jak to naprawić. ~ Brudna poprawka:find . -name "folder-to-delete" -print0 | xargs -r0 -- rm -r
-depth
argument to naprawia:find . -depth -name ".svn" -type d -exec rm -r "{}" \;
Oto przenośny wciąż szybszy niż akceptowany sposób odpowiedzi.
Użycie
+
zamiast średnika jakofind
terminatora poleceń optymalizuje użycie procesora. Może to być znaczące, jeśli masz wiele.svn
podkatalogów:Należy również zauważyć, że nigdy 1 trzeba zacytować nawiasów klamrowych tutaj.
1 Chyba że użyjesz
fish
muszli.źródło
+
ma zmniejszyć zużycie procesora, używając;
nie doprowadzić do polecenia zbyt długo błędu.Załóżmy, że używasz GNU Find , możesz użyć
-delete
opcji:co jest łatwiejsze do zapamiętania.
źródło
Gdy korzystam z komputera:
Katalogi zostały usunięte, ale pojawia się błąd:
dla każdego katalogu.
Moje katalogi nie są puste, więc opcja -delete nie będzie dla mnie działać. Znalazłem przyczynę tego zachowania tutaj :
Użyłem tego zamiast tego do obejścia:
Pamiętaj, że find nadal będzie próbował przekierować do katalogów o nazwie dirname, co nie jest tak naprawdę konieczne i zajmie trochę więcej czasu. W zależności od struktury katalogów możesz obejść ten problem za pomocą
--depth
opcji find. Ponadto, jeśli masz strukturę katalogów, taką jak dirname / foo / dirname, otrzymasz od rm błędy „Brak takiego pliku lub katalogu”. Aby stłumić błędy, możesz przekierować stderr na / dev / null lub użyć-f
flagi (force) za pomocą rm.źródło
find . -name "to-delete" -print0 | xargs -r0 -- rm -r
jest odporną na awarie wersją, która nie ulega awarii na przestrzeniach-prune
.-prune
aby uniknąć błędu „Brak takiego pliku lub katalogu”.Szybszym sposobem na to jest:
Jeśli masz „.svn” w innym „.svn”.
źródło
Rozwiązanie specyficzne dla Bash:
źródło
bash: /bin/rm: Argument list too long
Przekonałem się, że
-delete
akcja działa dobrze z-path
testem. Na przykład następujące problemy powinny rozwiązać problem z oryginalnymi plakatami:źródło
-delete
oznacza-depth
, i z pewnością usuwa niepuste katalogi w moim systemie.