2010-03-13 7 views
85

Ich versuche, den Inhalt eines Verzeichnisses mit Shell-Skript zu erhalten.Wie erhalte ich die Liste der Dateien in einem Verzeichnis in einem Shell-Skript?

Mein Skript ist:

for entry in `ls $search_dir`; do 
    echo $entry 
done 

wo $search_dir einen relativen Pfad ist. $search_dir enthält jedoch viele Dateien mit Leerzeichen im Namen. In diesem Fall wird dieses Skript nicht wie erwartet ausgeführt.

Ich weiß, ich könnte for entry in * verwenden, aber das würde nur für mein aktuelles Verzeichnis funktionieren.

Ich weiß, dass ich in dieses Verzeichnis wechseln kann, verwenden Sie for entry in * dann ändern Sie zurück, aber meine besondere Situation hindert mich daran, das zu tun.

Ich habe zwei relative Pfade $search_dir und $work_dir, und ich habe gleichzeitig auf beide arbeiten, sie zu lesen Erstellen/Löschen von Dateien in ihnen usw.

Also, was soll ich jetzt tun?

PS: Ich benutze bash.

+0

https: // Stackoverflow.com/questions/2437452/how-to-die-Liste-der-Dateien-in-einem-Verzeichnis-in-einem-Shell-Skript # neue Antwort – arun

Antwort

148
for entry in "$search_dir"/* 
do 
    echo "$entry" 
done 
+1

Können Sie erklären, warum 'für den Eintrag in" $ search_dir/* "' Funktioniert nicht? Warum müssen wir '/ *' außerhalb von Anführungszeichen setzen? – mrgloom

+2

@mrgloom: Weil Sie die Shell den Platzhalter glob haben müssen. –

+2

dies funktioniert nicht für mich auf macos –

14
for entry in "$search_dir"/* "$work_dir"/* 
do 
    if [ -f "$entry" ];then 
    echo "$entry" 
    fi 
done 
9
find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}" 
+1

Ich weiß, dass das ziemlich alt ist, aber ich kann nicht den letzten 'xargs -0 -i echo" {} "Befehl erhalten, interessiert mich etwas zu erklären? Insbesondere was ist das '-i Echo '{}" 'Teil? Ich habe auch von der 'man'-Seite gelesen, dass' -i' jetzt veraltet ist und wir sollten '-I' verwenden. – drkg4b

+1

'-i' ersetzt' {} 'mit arg. –

+0

Danke! Das ist nützlich, auch für die Langsam denkenden wie mich denke ich, dass die '{}' die Zeichenfolge ist, die durch den 'find' Befehl mit den Übereinstimmungen ersetzt wird. – drkg4b

14

Die anderen Antworten hier sind groß und Ihre Frage beantworten, aber dies ist das Top-Google-Ergebnis für „bash Liste der Dateien im Verzeichnis erhalten“, (was ich für zu suchen speichert eine Liste von Dateien), so dachte ich, ich würde eine Antwort auf dieses Problem schreiben:

ls $search_path > filename.txt 

Wenn Sie nur eine bestimmte Art wollen (zB alle TXT-Dateien):

ls $search_path | grep *.txt > filename.txt 

Beachten Sie, dass $ search_path optional ist; ls> Dateiname.txt führt das aktuelle Verzeichnis aus.

+0

Keine Notwendigkeit, grep zu verwenden, um nur TXT-Dateien zu erhalten: 'ls $ search_path/*. Txt> filename.txt '. Aber noch wichtiger, man sollte die Ausgabe des Befehls ls nicht zum Parsen von Dateinamen verwenden. –

3

Dies ist eine Möglichkeit, es zu tun, wo die Syntax einfacher für mich zu verstehen ist:

yourfilenames=`ls ./*.txt` 
for eachfile in $yourfilenames 
do 
    echo $eachfile 
done 

./ ist das aktuelle Verzeichnis Arbeits kann aber mit jedem Pfad
*.txt kehren anything.txt
ersetzt werden Sie können prüfen, was leicht aufgelistet wird, indem Sie den Befehl ls direkt in das Terminal eingeben.

Grundsätzlich erstellen Sie eine Variable yourfilenames enthält alles, was der Befehl list als separates Element zurückgibt, und dann durchlaufen Sie es. Die Schleife erstellt eine temporäre Variable eachfile, die ein einzelnes Element der Variablen enthält, die es durchläuft, in diesem Fall ein Dateiname. Das ist nicht unbedingt besser als die anderen Antworten, aber ich finde es intuitiv, weil ich bereits mit dem ls Befehl und der for-Schleife-Syntax vertraut bin.

0

Auf der Linux-Version, die ich mit (x86_64 GNU/Linux) arbeiten folgende Arbeiten:

for entry in $search_dir/* 
do 
    echo $entry 
done 
Verwandte Themen