użyj rm do rekurencyjnego usuwania plików i katalogów

17

czy można użyć rm do rekurencyjnego usuwania plików i katalogów pasujących do wzorca bez używania innych poleceń?

użytkownik15586
źródło

Odpowiedzi:

35

Aby bezpośrednio odpowiedzieć na pytanie: „nie - nie możesz robić tego, co opisujesz rm”.

Możesz to jednak zrobić, łącząc to z find. Oto jeden z wielu sposobów, w jaki możesz to zrobić:

 # search for everything in this tree, search for the file pattern, pipe to rm
 find . | grep <pattern> | xargs rm

Na przykład, jeśli chcesz nuke wszystkie pliki * ~, możesz to zrobić:

 # the $ anchors the grep search to the last character on the line
 find . -type f | grep '~'$ | xargs rm

Aby rozwinąć z komentarza * :

 # this will handle spaces of funky characters in file names
 find -type f -name '*~' -print0 | xargs -0 rm
królikarnia
źródło
1
prawda - jeśli pominiesz ostatnią fajkę, najpierw otrzymasz listę wszystkiego :)
warren
2
Może nie odpowiedzieć bezpośrednio na pytanie plakatu, ale jest najbliżej tego, czego chcą.
Drakia
1
Krasnolud, czy to nie jest trochę gorzkie bez powodu?
Gnoupi
10
Zachowaj ostrożność podczas używania find | grep | xargs rm. Jeśli istnieją pliki ze spacjami (lub znakami nowej linii), spowoduje to uszkodzenie (w zależności od nazw plików i ich lokalizacji) może usunąć rzeczy, których nie zamierzałeś usunąć. find … -print0 | xargs -0 rmbędzie znacznie bardziej wytrzymały. Będzie to jednak oznaczało, że nie możesz użyć grepi musisz użyć findpredykatów, aby dopasować i wydrukować 0 tylko żądanych plików. Drugi przykład Warrena będzie bardziej niezawodny find -type f -name '*~' -print0 | xargs -0 rm.
Chris Johnsen
1
Jeśli chcesz wykonać pojedyncze polecenie, utwórz alias, używając jednego z podanych poleceń find. W razie potrzeby odpowie na to później.
casualuser
8

„bez użycia innych poleceń”

Nie.

Drakia
źródło
Fajna odpowiedź ilustrująca „ścisłą odpowiedź na pytanie początkowe (na ryzyko braku możliwości dostarczenia rozwiązania)” kontra „zapewniają rozwiązanie, nawet jeśli nie jest ściśle dopasowane do narzuconych ograniczeń”.
Gnoupi
Napisałem to tylko, gdy „Dwarf” narzekał na odpowiedź, która faktycznie stanowiła rozwiązanie. Bez użycia innych poleceń tak naprawdę nie ma sposobu na rekurencyjne usunięcie pliku, które pasuje do wzorca, wystarczy usunięcie pliku / katalogu z bieżącego katalogu.
Drakia
3

Za pomocą Bash, z globstarsetem, tak :

rm basedir/**/my*pattern*

Wypróbuj ls -1najpierw np. Przed, rmaby wyświetlić listę pasujących plików.

Ustawiasz opcje poprzez np shopt -s globstar.


Alternatywnie, krótszy findwariant:

find -type f -name 'my*pattern*' -delete

lub dla GNU find:

find -type f -name 'my*pattern*' -exec rm {} +

lub inna alternatywa dla non-GNU find(nieco wolniej):

find -type f -name 'my*pattern*' -exec rm {} \;

Aby również usunąć katalogi, o które prosisz: po prostu zmień rmna rm -rpowyższe polecenia i pomiń dopasowanie tylko -type fw findpoleceniach.

Daniel Andersson
źródło
0

Odrzuciłbym „rm -rf” gdzie jest kombinacja nazw plików i pasujących wzorców, takich jak * i? itp. (np. dzisiejszy_log_2009 ????. log). To zacznie się od bieżącego Dir i zakończy rekurencyjne usuwanie plików, które wykonują ten wzorzec.

ianfuture
źródło
To nie zadziała, ponieważ wzorzec jest rozszerzany przez powłokę w bieżącym katalogu. W przypadku cytowania wzór staje się nazwą pliku ze znakami specjalnymi. np. aby usunąć plik [, można napisać rm „[”. Wzór po prostu traci znaczenie.
casualuser
0

Jeśli używasz zsh (1) , włącz „rozszerzone globowanie” setopt extendedglobw .zshrc. Prefiks wzoru „** /” spowoduje następnie usunięcie rekurencyjne:

% rm -rf ** / <wzorzec>

Jeśli jednak jest wiele plików do usunięcia, powinieneś skorzystać z funkcji find (1) z xargs (1) lub -exec, a także polecam to zrobić w skryptach powłoki.

kaleissin
źródło