Ich habe diese Liste von Dateien auf einem Linux-Server:
abc.log.2012-03-14
abc.log.2012-03-27
abc.log.2012-03-28
abc.log.2012-03-29
abc.log.2012-03-30
abc.log.2012-04-02
abc.log.2012-04-04
abc.log.2012-04-05
abc.log.2012-04-09
abc.log.2012-04-10
Ich habe ausgewählte Protokolldateien nacheinander mit dem folgenden Befehl gelöscht rm -rf
:
rm -rf abc.log.2012-03-14
rm -rf abc.log.2012-03-27
rm -rf abc.log.2012-03-28
Gibt es eine andere Möglichkeit, um die ausgewählten Dateien sofort zu löschen?
GNU
benötigt wird?Antworten:
Bash unterstützt alle Arten von Platzhaltern und Erweiterungen.
Ihr genauer Fall würde durch Klammererweiterung wie folgt behandelt:
Das Obige würde sich zu einem einzigen Befehl mit allen drei Argumenten erweitern und der Eingabe entsprechen:
Es ist wichtig zu beachten, dass diese Erweiterung von der Shell durchgeführt wird, bevor sie
rm
überhaupt geladen wird.quelle
Verwenden Sie einen Platzhalter (
*
), um mehrere Dateien abzugleichen.Mit dem folgenden Befehl werden beispielsweise alle Dateien gelöscht, deren Namen mit beginnen
abc.log.2012-03-
.Ich würde empfehlen zu laufen
ls abc.log.2012-03-*
, die Dateien auszuführen, damit Sie sehen können, was Sie löschen möchten, bevor Sie denrm
Befehl ausführen.Weitere Informationen finden Sie in der Bash-Manpage zur Dateinamenerweiterung .
quelle
Wenn Sie alle Dateien löschen möchten, deren Namen einem bestimmten Formular entsprechen, ist ein Platzhalter (Glob-Muster) die einfachste Lösung. Einige Beispiele:
Reguläre Ausdrücke sind leistungsfähiger als Platzhalter. Sie können die Ausgabe von
grep
bis fütternrm -f
. Wenn beispielsweise einige der Dateinamen mit"abc.log"
und andere mit beginnen"ABC.log"
,grep
können Sie eine Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung durchführen:Dies führt zu Problemen, wenn einer der Dateinamen lustige Zeichen enthält, einschließlich Leerzeichen. Achtung.
Wenn ich dies tue, führe ich zuerst den
ls | grep ...
Befehl aus und überprüfe, ob er die gewünschte Ausgabe erzeugt - insbesondere wenn ich Folgendes verwenderm -f
:Dabei wird
!!
auf den vorherigen Befehl erweitert. Oder ich kann Aufwärtspfeil oder Strg-P eingeben und die vorherige Zeile bearbeiten, um die hinzuzufügenrm -f
Befehl .Dies setzt voraus, dass Sie die Bash-Shell verwenden. Einige andere Shells, insbesondere csh und tcsh sowie einige ältere, von sh abgeleitete Shells, unterstützen die
$(...)
Syntax möglicherweise nicht . Sie können die entsprechende Backtick-Syntax verwenden:Das
$(...)
Syntax ist einfacher zu lesen und wenn Sie wirklich ehrgeizig sind, kann sie verschachtelt werden.Wenn die Teilmenge der Dateien, die Sie löschen möchten, nicht einfach mit einem regulären Ausdruck ausgedrückt werden kann, besteht ein Trick, den ich häufig verwende, darin, die Dateien in einer temporären Textdatei aufzulisten und sie dann zu bearbeiten:
Ich kann die
list
Datei dann manuell bearbeiten , wobei nur die Dateien übrig bleiben, die ich entfernen möchte, und dann:oder
(Dies setzt wiederum voraus, dass keiner der Dateinamen lustige Zeichen enthält, insbesondere Leerzeichen.)
Oder wenn
list
ich die Datei bearbeite , kann ichrm -f
am Anfang jeder Zeile Folgendes hinzufügen und dann:oder
Bearbeiten der Datei ist auch eine Gelegenheit zitiert , wo nötig hinzuzufügen, zum Beispiel Wechsel
rm -f foo bar
zurm -f 'foo bar'
.quelle
Verwenden Sie einfach die mehrzeilige Auswahl in sublime, um alle Dateien in einer einzigen Zeile zu kombinieren, ein Leerzeichen zwischen den einzelnen Dateinamen einzufügen und
rm
am Anfang der Liste einzufügen. Dies ist vor allem dann nützlich, wenn die zu löschenden Dateinamen kein Muster enthalten.quelle
Ein Platzhalter würde hierfür gut funktionieren, obwohl es aus Sicherheitsgründen am besten ist, die Verwendung des Platzhalters so gering wie möglich zu halten, also etwas in dieser Richtung:
Obwohl es so aussieht, sind das nur einzelne Dateien? Die rekursive Option sollte nicht erforderlich sein, wenn keines dieser Elemente Verzeichnisse sind. Verwenden Sie dies daher am besten nicht, nur aus Sicherheitsgründen.
quelle
Ich bin kein Linux-Guru, aber ich glaube, Sie möchten Ihre Liste der Ausgabedateien an weiterleiten
xargs rm -rf
. Ich habe so etwas in der Vergangenheit mit guten Ergebnissen verwendet. Testen Sie zuerst ein Beispielverzeichnis!BEARBEITEN - Ich habe es möglicherweise falsch verstanden, basierend auf den anderen Antworten, die angezeigt werden. Wenn Sie Platzhalter verwenden können, großartig. Ich nahm an, dass Ihre ursprüngliche Liste, die Sie angezeigt haben, von einem Programm generiert wurde, um Ihnen Ihre "Auswahl" zu geben, und dachte daher, Piping to
xargs
wäre der richtige Weg.quelle
Wenn Sie alle Dateien, die zu einem Verzeichnis gehören, gleichzeitig löschen möchten. Beispiel: Ihr Verzeichnisname lautet "log" und das Verzeichnis "log" enthält die Dateien abc.log.2012-03-14, abc.log.2012-03-15 usw. Sie müssen sich über dem Protokollverzeichnis befinden und:
quelle