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 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.
„bez użycia innych poleceń”
Nie.
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.
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 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.