
Ich habe den Befehl gegeben:
ls -lrt
und die aufgelisteten Dateien und Verzeichnisse sind:
drwxr-xr-x 4 root root 4096 Feb 2 2014 abc
drwxr-xr-x 4 root root 4096 Feb 2 2014 cde
drwxr-xr-x 4 root root 4096 Feb 2 2014 efg
-rwxr-xr-x 4 root root 4096 Feb 2 2014 aaa.txt
Jetzt möchte ich mithilfe einer For- oder While-Schleife herausfinden, ob sich die aufgelisteten Ausgabedateien in einem Verzeichnis befinden oder nicht.
Antwort1
Verwenden Sie mit ls
den folgenden Befehl, um nur Verzeichnisse aufzulisten.
ls -d -- */
Um normale Dateien mit ls selbst aufzulisten (und vorausgesetzt, dass die Dateinamen keine Zeilenumbruchzeichen enthalten), können Sie den folgenden Befehl verwenden.
ls -p | grep -v /
Um nur die regulären Dateien aufzulisten, können Sie mit GNU und einigen anderen Find-Implementierungen
find . -maxdepth 1 -type f
(Beachten Sie, dass im Gegensatz zum vorherigen auch versteckte Dateien enthalten sind und die Liste nicht sortiert ist)
Das Standardäquivalent wäre:
find . ! -name . -prune -type f
Antwort2
Wenn Sie so etwas wie eine „Shell-Skript-Vorlage“ zum Durchlaufen von Verzeichnisinhalten und Ausführen von Aktionen basierend auf dem Dateityp haben möchten, könnte Ihnen das Folgende einen Hinweis geben:
for f in *
do
if [[ -d "$f" ]]
then
... your processing of directories here, reference them as "$f" ...
fi
done
Dies würde alle Einträge im aktuellen Verzeichnis durchsehen, prüfen, ob es sich um Verzeichnisse handelt, und die von Ihnen gewünschte Verarbeitung durchführen. Beachten Sie, dass die Syntax für den Verzeichnistest BASH-spezifisch ist. Verwenden Sie im Allgemeinen if [ -d "$f" ]
.
Ein anderer Ansatz würde die Liste nur auf Verzeichniseinträge beschränken:
for d in */
do
... whatever you need to do on directory "$d" ...
done
Antwort3
Sie benötigen keine Schleife, um alle Verzeichnisse zu finden. Sie können find
stattdessen den folgenden Befehl verwenden:
find . -maxdepth 1 -type d
Dadurch werden alle Verzeichnisse im aktuellen Verzeichnis aufgelistet. Wenn Sie die ls -l
Ausgabe möchten, können Sie Folgendes tun:
find . -maxdepth 1 -type d | xargs ls -ld
Wenn Sie unbedingt eine Schleife verwenden möchten, können Sie die folgende Konstruktion verwenden:
for file in $(ls)
do
if [[ -d $file ]]
then
ls -ld $file
fi
done
Die for
Schleife durchläuft alle von zurückgegebenen Einträge und prüft ls
dann, if
ob es sich bei dem Eintrag um ein Verzeichnis handelt.
Antwort4
Verzeichnisnamen auflisten
compgen -d
Nicht von einem Punkt aus starten
compgen -d -X '.*' | xargs ls -dlrt