Wie geht man ohne rekursiv

19

Ich versuche, einige Dateien mit einem Muster in einem Verzeichnis zu ls. Ich möchte nur die erste Ebene nicht rekursiv scannen.

Mein Drehbuch:

for i in $(ls $INCOMINGDIR/*$BUSSINESSDATE*)
do
  echo $i;
done

Über Befehl rekursiv scannen. Wie kann man es nur schaffen, das Verzeichnis der ersten Ebene zu scannen?

Sas
quelle
printf %s\\n "$INCOMINGDIR/"*"$BUSINESSDATE"*
mikeserv

Antworten:

38

Nicht analysierenls . Verwenden Sie auch nicht ALL_CAPS_VARS

for i in "$incoming_dir"/*"$business_date"*; do

Interaktiv, lshat eine -dOption, die verhindert, dass in Unterverzeichnisse absteigend:

ls -d $INCOMINGDIR/*$BUSSINESSDATE*
Glenn Jackman
quelle
Vielen Dank für die Info, ich werde anfangen, Dateien mit neuen Zeilen im Namen zu erstellen, nur um Sysadmins jetzt zu ärgern.
Petah,
Deshalb verwendet der intelligente Sysadmin / Programmierer "${i}". Sie wissen nie, was drin sein könnte i.
Ricky Beam
@Petah: oder jemand mit bösen Absichten könnte eine Datei mit dem Namen erstellen my_file.doc[newline]another_persons_file.docund hoffen, dass einige Skripte versuchen, die darin enthaltenen 2 Dateinamen zu "rm" ... Glenns Link ist ein Muss (auf mywiki.wooledge.org sollte jeder lesen) die ganze FAQ und auch die Fallstricke Seite)
Olivier Dulac
1
cool. Ich kannte die Option -d nicht!
Dokaspar
Groß! Dies funktioniert auch für einfachere Dinge. Listen Sie beispielsweise alle Dateien mit ls -d .*
Punktpräfix auf
8

Es gibt keinen Grund, warum dieser Befehl rekursiv sein sollte. Wenn jedoch eine $INCOMINGDIR/*$BUSSINESSDATE*Übereinstimmung mit einem Verzeichnis vorliegt, wird der Inhalt dieses Verzeichnisses anstelle des Verzeichnisses selbst angezeigt. Aber es würde keine Rekursion jenseits dieser Ebene geben.

Verwenden Sie diesen Befehl, um diesen Effekt zu vermeiden:

ls -d "$INCOMINGDIR/"*"$BUSSINESSDATE"*

for ... in befehle mit ls Ausgabe sind riskant.

Im Allgemeinen findscheint eine bessere Lösung oder

for i in "$INCOMINGDIR/"*"$BUSSINESSDATE"*
Hauke ​​Laging
quelle