Schleife der Listing-Dateien unter UNIX

Schleife der Listing-Dateien unter UNIX

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 lsden 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 findstattdessen den folgenden Befehl verwenden:

find . -maxdepth 1 -type d

Dadurch werden alle Verzeichnisse im aktuellen Verzeichnis aufgelistet. Wenn Sie die ls -lAusgabe 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 forSchleife durchläuft alle von zurückgegebenen Einträge und prüft lsdann, ifob 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

verwandte Informationen