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, ls
z. 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 -A
mit einer if
Anweisung 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
find
kann in Verbindung mit ifne
als 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 ls
das 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
maxdepth
und mindepth
Optionen 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 find
ermöglicht auch eine Feinabstimmung mithilfe der Argumente, wie Dateinamen, Dateitypen und vielem mehr.