Antworten:
Um Ihre Frage direkt zu beantworten: "Nein - Sie können nicht tun, was Sie beschreiben rm
".
Sie können es jedoch tun, indem Sie es damit kombinieren find
. Hier ist eine von vielen Möglichkeiten, wie Sie das tun können:
# search for everything in this tree, search for the file pattern, pipe to rm
find . | grep <pattern> | xargs rm
Wenn Sie beispielsweise alle * ~ -Dateien mit einem Nuke versehen möchten, können Sie dies folgendermaßen tun:
# the $ anchors the grep search to the last character on the line
find . -type f | grep '~'$ | xargs rm
So erweitern Sie einen Kommentar * :
# this will handle spaces of funky characters in file names
find -type f -name '*~' -print0 | xargs -0 rm
find | grep | xargs rm
. Wenn Dateien mit Leerzeichen (oder Zeilenumbrüchen) vorhanden sind, kann dies dazu führen, dass (abhängig von den Dateinamen und der Position der Leerzeichen) Daten gelöscht werden, die Sie nicht löschen wollten. find … -print0 | xargs -0 rm
wird viel robuster sein. Dies bedeutet jedoch, dass Sie die Prädikate nicht verwenden können grep
und müssen, um find
nur die gewünschten Dateien abzugleichen und zu drucken. Das zweite Beispiel von warren wird robuster sein als find -type f -name '*~' -print0 | xargs -0 rm
.
"ohne andere Befehle zu benutzen"
Nein.
Mit Bash, mit globstar
set, yes :
rm basedir/**/my*pattern*
Probieren Sie es zB ls -1
zuerst aus, bevor rm
Sie die passenden Dateien auflisten.
Sie setzen Optionen durch zB shopt -s globstar
.
Alternativ eine kürzere find
Variante:
find -type f -name 'my*pattern*' -delete
oder für GNU find
:
find -type f -name 'my*pattern*' -exec rm {} +
oder eine andere Alternative für Nicht-GNU find
(etwas langsamer):
find -type f -name 'my*pattern*' -exec rm {} \;
Wenn Sie auch Verzeichnisse entfernen möchten, gehen Sie wie folgt vor: Wechseln Sie rm
in rm -r
die obigen Befehle und überspringen Sie den Abgleich nur -type f
in den find
Befehlen.
Ich hätte "rm -rf" abgesaugt, wo eine Kombination aus Dateinamen und übereinstimmenden Mustern wie * und? etc (zB todays_log_2009 ????. log). Das startet mit dem aktuellen Verzeichnis und führt dazu, dass Dateien, die dieses Muster enthalten, rekursiv entfernt werden.
Wenn Sie zsh (1) verwenden , setopt extendedglob
aktivieren Sie "Extended Globbing" mit in .zshrc. Das Präfixieren des Musters mit '** /' löscht dann rekursiv:
% rm -rf ** / <Muster>
Wenn Sie jedoch viele Dateien löschen möchten, sollten Sie auf find (1) mit xargs (1) oder -exec zurückgreifen, und ich empfehle, dies auch in Shell-Skripten zu tun.