Löschen Sie Dateien im Verzeichnis ohne Fehler, wenn es bereits leer ist

31

Als Teil eines Bereitstellungsskripts möchte ich einige zwischengespeicherte Inhalte aus meinem temporären Verzeichnis sichern. Ich benutze einen Befehl wie:

rm /tmp/our_cache/*

Wenn /tmp/our_cachejedoch leer ist (ziemlich häufig, wenn viele Änderungen schnell hintereinander auf unseren Testserver übertragen werden), wird die folgende Fehlermeldung ausgegeben:

rm: cannot remove `/tmp/our_cache/*': No such file or directory

Es ist keine große Sache, aber es ist ein wenig hässlich und ich möchte das Rausch-zu-Signal-Verhältnis in der Ausgabe dieses Skripts verringern.

Was ist eine prägnante Möglichkeit in Unix, den Inhalt eines Verzeichnisses zu löschen, ohne dass Meldungen angezeigt werden, dass das Verzeichnis bereits leer ist?

Mark Amery
quelle

Antworten:

48

Da Sie vermutlich alle Dateien ohne Aufforderung entfernen möchten, können Sie den -fSchalter verwenden, rmum nicht vorhandene Dateien zu ignorieren.

rm -f /tmp/our_cache/*

Aus der Manpage:

-f, --force
          ignore nonexistent files, never prompt

Wenn sich möglicherweise Unterverzeichnisse in befinden /tmp/our_cache/und Sie möchten, dass diese und ihre Inhalte ebenfalls gelöscht werden, vergessen Sie den -rSchalter nicht.

depquid
quelle
3
offensichtlichste Lösung und ich habe nicht darüber nachgedacht! Ich fühle mich wie der erste Mann auf diesem Comic xkcd.com/399 ;-)
Huygens
6
find /tmp/our_cache/ -mindepth 1 -delete

Bearbeiten 1

entfernter "-Typ f

Bearbeiten 2

Nicht-Standard-Option hinzugefügt, -mindepth 1um zu verhindern, dass das Such-Stammverzeichnis entfernt wird (nachdem die -type fEinschränkung aufgehoben wurde).

Hauke ​​Laging
quelle
Nur eine Anmerkung, ich würde weglassen, -type fda es möglicherweise auch temporäre Verzeichnisse gibt (obwohl das Beispiel in der Frage sie nicht berücksichtigt, also sind sie wahrscheinlich nicht da ...)
Izkata
1
Mit -type fwerden nur reguläre Dateien gelöscht, sodass beispielsweise symbolische Links nicht gelöscht werden.
Huygens
@rush Tut mir leid, ich habe das nicht überprüft, sondern mir nur die Man-Pages angesehen, auf denen "Delete files" steht, und Verzeichnisse sowieso nicht erwähnt. Ich lösche meinen Kommentar.
Hauke ​​Laging
1
Das lässt sich /tmp/our_cacheso gut wie möglich entfernen rm -r /tmp/our_cache. Wenn Sie nicht standardmäßige Optionen verwenden, können Sie diese verwenden -mindepth 1. Beachten Sie, dass es im Gegensatz dazu rm /tmp/our_cache/*auch Unterverzeichnisse sowie deren Inhalt und versteckte Dateien entfernt.
Stéphane Chazelas
2

Sie können den Standardfehler /dev/nullso umleiten, dass dieser nicht gedruckt wird

$  rm /tmp/our_cache/* 2>/dev/null
pradeepchhetri
quelle
2
Würde dies nicht auch die angezeigten Fehler unterdrücken, wenn beispielsweise eine Datei nicht gelöscht werden kann, weil sie gerade verwendet wird? Der einzige Fehler, den ich unterdrücken möchte, ist der, der angezeigt wird, wenn das Zielverzeichnis leer ist. Dies scheint unerwünschte Nebenwirkungen zu haben.
Mark Amery
Selbst wenn Sie versuchen, eine Datei zu löschen, die von einem Prozess geöffnet wurde, wird kein Fehler angezeigt.
Pradeepchhetri
1

Ein anderer Weg (wenn auch etwas übertrieben ...):

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

Dies verwendet testoder [, um zu testen, ob die Zeichenfolge, die von der Ausführung eines lsin Ihrem Verzeichnis zurückgegeben wurde, nicht leer ist. Wenn diese Zeichenfolge dann und nur dann NICHT leer ist, wird alles in Ihrem Verzeichnis entfernt.

HINWEIS: Wenn Sie den Glob aus dem entfernen, lswird der Fehler "Keine Dateien" unterdrückt.

h3rrmiller
quelle
-1

Wenn Sie ein BASH-Skript verwenden, können Sie Folgendes versuchen:

if test "$(ls /tmp/our_cache/)" !=  ""; then rm /tmp/our_cache/*; fi

Andernfalls wird immer noch ein Fehler ausgegeben, wenn ein "echtes" Problem vorliegt oder wenn eine Datei geschützt ist (Sie müssten dann den -fModifikator " rmlöschen", um diesen Dateityp zu löschen). Der Fehler wird jedoch vermieden, wenn keine Dateien vorhanden sind.

Wenn Sie für Ihre Skripterstellung eine andere Shell als BASH verwenden, wie zsh, ksh, können Sie diese andere Syntax ausprobieren, die möglicherweise portabler ist:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
Huygens
quelle