Wie kann ich überprüfen, ob ein Ordner leer ist oder nicht, und seinen Inhalt in einer if-then-else-Anweisung verwenden?

Wie kann ich überprüfen, ob ein Ordner leer ist oder nicht, und seinen Inhalt in einer if-then-else-Anweisung verwenden?

Ich muss prüfen, ob ein Ordner leer ist oder nicht, und entsprechend der Ausgabe muss ich einige andere Befehle ausführen. Ich arbeite an Ubuntu 18.04.5 LTS.

Mein Bash-Skript:

if [ "$(ls -A /mnt/mamdrive/"As Metadata"/)" ] || ["$(ls -A /mnt/mamdrive/"As Video"/)"  ]; then
    echo "copy file"
else
    echo "dont copy"
fi

Manchmal funktioniert die Bedingung, manchmal aber auch nicht, und es ist schwierig, sie zu reproduzieren. Gibt es eine andere Möglichkeit, zu prüfen, ob das Verzeichnis leer ist, und entsprechend Maßnahmen zu ergreifen?

Antwort1

Ich würde etwas vorschlagen, das nicht auf der String-Ausgabe basiert, lsz. B. um zu testen, ob es Ergebnisse einer Glob-Erweiterung gibt:

#!/bin/bash

shopt -s nullglob       # don't return literal glob if matching fails
shopt -s dotglob        # make * match "almost all" like ls -A

set -- /mnt/mamdrive/"As Metadata"/*

if (( $# > 0 )); then
  echo "not empty"
else
  echo "empty"
fi

Wenn Sie testen möchten, ob zwei Verzeichnisse beide leer sind, können Sie einfach beide globben:

set -- /mnt/mamdrive/"As Metadata"/* /mnt/mamdrive/"As Video"/*

Antwort2

Am einfachsten geht das ls -Amit einer ifAnweisung wie dieser:

path=$(ls -A '/whatever/sub directory/more spaces')
if [[ ! -z "$path" ]]; then
    echo "Directory is NOT empty!"
else
    echo "Directory is empty!"
fi

Antwort3

findkann in Verbindung mit ifneals Copy-on-Empty funktionieren:

$ find test/ -maxdepth 0 -empty | ifne cp -t test/ a

Die Verwendung in einer if-Anweisung kann etwa so aussehen:

#!/bin/bash

if find test/ -maxdepth 0 ! -empty | ifne false; then
   echo Directory is empty
else
   echo Directory is not empty
fi

Antwort4

Da lsdas Parsen bekanntermaßen fehleranfällig ist, weil es von Anfang an nicht für das Parsen gedacht war, sollten andere Lösungen bevorzugt werden. Zusätzlich zur Antwort von @steeldriver könnte dies auch mit folgendem geschehen find:

if [[ "$(find '/mnt/mamdrive/As Metadata' '/mnt/mamdrive/As Video' -maxdepth 1 -mindepth 1 2>/dev/null)" ]]
then
    echo “copy file”
else
    echo "don't copy"
fi

maxdepthund mindepthOptionen werden hier verwendet, um nur direkte untergeordnete Elemente angegebener Verzeichnisse zu drucken und zu scannen. Redirect stellt sicher, dass Fehlermeldungen nicht gedruckt werden, wenn einige Argumente nicht vorhanden sind.

Das Hinzufügen mehrerer Verzeichnisse funktioniert als ODER, sodass „Datei kopieren“ ausgegeben wird, wenn mindestens eines der getesteten Verzeichnisse nicht leer ist. Die Verwendung findermöglicht auch eine Feinabstimmung mithilfe der Argumente, wie Dateinamen, Dateitypen und vielem mehr.

verwandte Informationen