czy można użyć rm do rekurencyjnego usuwania plików i katalogów pasujących do wzorca bez używania innych poleceń?
czy można użyć rm do rekurencyjnego usuwania plików i katalogów pasujących do wzorca bez używania innych poleceń?
Odpowiedzi:
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
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 rm
będzie znacznie bardziej wytrzymały. Będzie to jednak oznaczało, że nie możesz użyć grep
i musisz użyć find
predykató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
.
„bez użycia innych poleceń”
Nie.
Za pomocą Bash, z globstar
setem, tak :
rm basedir/**/my*pattern*
Wypróbuj ls -1
najpierw np. Przed, rm
aby wyświetlić listę pasujących plików.
Ustawiasz opcje poprzez np shopt -s globstar
.
Alternatywnie, krótszy find
wariant:
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ń rm
na rm -r
powyższe polecenia i pomiń dopasowanie tylko -type f
w find
poleceniach.
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.
Jeśli używasz zsh (1) , włącz „rozszerzone globowanie” setopt extendedglob
w .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.