Jedną z misji narzędzia eksportu, które mam w swojej aplikacji, jest oczyszczenie wszystkich .svn
katalogów z drzewa katalogów aplikacji. Szukam polecenia rekurencyjnego w powłoce systemu Linux, które przejdzie całe drzewo i usunie .svn
pliki.
Nie używam eksportu, ponieważ ten skrypt będzie używany dla niektórych innych nazw plików / katalogów, które nie są związane z SVN. Próbowałem czegoś takiego:
find . -name .svn | rm -fr
Nie działało ...
Odpowiedzi:
Spróbuj tego:
Przed uruchomieniem takiego polecenia często lubię najpierw uruchomić to:
źródło
find . -name .svn -exec rm -rf '{}' \;
find . -name .svn -exec echo {} \;
{} \;
zrobić?ls
otrzymujęentries prop-base props text-base tmp
dane wyjściowe ...To, co napisałeś, wysyła listę nazw (i ścieżek) rozdzielonych znakiem nowej linii
rm
, ale rm nie wie, co zrobić z tym wejściem. Oczekuje tylko parametrów wiersza poleceń.xargs
pobiera dane wejściowe, zwykle oddzielone znakami nowej linii, i umieszcza je w wierszu poleceń, więc dodanie xargs sprawia, że miałeś to, co miałeś do roboty:xargs
jest na tyle inteligentny, że przekaże tylko tyle argumentów,rm
ile może zaakceptować. Tak więc, jeśli masz milion plików, może on działaćrm
1 000 000/65 000 razy (jeśli twoja powłoka może zaakceptować 65002 argumentów w wierszu poleceń {65k plików + 1 dla rm + 1 dla -fr}).Jak słusznie zauważyli ludzie, działają również:
Obie pierwsze dwie
-exec
formy wymagająrm
usunięcia każdego folderu, więc jeśli miałbyś 1 000 000 folderów,rm
byłby wywoływany 1 000 000 razy. To z pewnością mniej niż idealne. Nowsze implementacjerm
pozwalają na zakończenie polecenia ze+
wskazaniem,rm
które akceptuje jak najwięcej argumentów:Ostatnia wersja find / xargs używa print0, co powoduje, że find generuje dane wyjściowe, które wykorzystują
\0
jako terminator zamiast nowego wiersza. Ponieważ systemy POSIX dopuszczają dowolny znak oprócz\0
nazwy pliku, jest to naprawdę najbezpieczniejszy sposób, aby upewnić się, że argumenty są poprawnie przekazywane dorm
aplikacji lub wykonywanej aplikacji.Ponadto istnieje plik,
-execdir
który zostanie wykonanyrm
z katalogu, w którym plik został znaleziony, a nie z katalogu podstawowego, i-depth
który rozpocznie głębokość jako pierwszy.źródło
Nie ma potrzeby używania potoków, xargs, exec ani niczego innego:
Edycja: Żartuję, ewidentnie
-delete
wywołujeunlinkat()
pod maską, więc zachowuje się jakunlink
lubrmdir
i nie będzie działać na katalogach zawierających pliki.źródło
-delete
nie dotknie katalogu, jeśli zawiera on pliki.-force
Dla-delete
predykatu nie ma flagi rekurencyjnej , więc ta odpowiedź jest bezużyteczna. Tak więc, jest to powrót do|xargs rm -rf
, który jest mniej brzydki następnie wpisać-exec
z jego brzydkich zastępcze i średnikiem:-exec rm -rf '{}' \;
.Istnieje już wiele odpowiedzi na usunięcie katalogu .svn. Ale chcę dodać, że możesz uniknąć tych katalogów od samego początku, jeśli zrobisz eksport zamiast kasy:
źródło
Jeśli nie lubisz dużo
ostrzeżenia, a następnie użyj
-depth
przełącznika:źródło
W systemie Windows można użyć następującego skryptu rejestru, aby dodać „Usuń foldery SVN” do menu kontekstowego prawym przyciskiem myszy. Uruchom go w dowolnym katalogu zawierającym te nieznośne pliki.
źródło
Prawie to miałeś. Jeśli chcesz przekazać dane wyjściowe polecenia jako parametry do innego, musisz użyć xargs. Dodanie
-print0
upewnia się, że skrypt obsługuje ścieżki ze spacjami:źródło
źródło
Jako ważny problem, gdy chcesz użyć powłoki do usunięcia folderów .svn, potrzebujesz argumentu -depth, aby uniemożliwić komendzie find wejście do właśnie usuniętego katalogu i wyświetlenie komunikatów o błędach, takich jak np.
W rezultacie możesz użyć polecenia find, jak poniżej:
źródło
Spróbuj tego:
Przeczytaj więcej o poleceniu find na developerWorks .
źródło
Alternatywnie, jeśli chcesz wyeksportować kopię bez modyfikowania kopii roboczej, możesz użyć rsync:
źródło