it-swarm.com.de

Wie bekomme ich die Liste der Dateien in einem Verzeichnis in einem Shell-Skript?

Ich versuche, den Inhalt eines Verzeichnisses mithilfe von Shell-Skript abzurufen.

Mein Skript lautet:

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

dabei ist $search_dir ein relativer Pfad. $search_dir enthält jedoch viele Dateien, deren Namen Leerzeichen enthalten. 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, for entry in * verwenden und dann zurückwechseln kann, aber meine besondere Situation hindert mich daran.

Ich habe zwei relative Pfade $search_dir und $work_dir, und ich muss an beiden gleichzeitig arbeiten, sie lesen und Dateien darin erstellen/löschen usw.

Was mache ich jetzt?

PS: Ich benutze Bash.

110
jrharshath
for entry in "$search_dir"/*
do
  echo "$entry"
done
203

Die anderen Antworten hier sind großartig und beantworten Ihre Frage, aber dies ist das Top-Ergebnis von Google für "bash get liste von Dateien im Verzeichnis" (nach dem ich gesucht habe, um eine Liste von Dateien zu speichern) Antwort auf dieses Problem:

ls $search_path > filename.txt

Wenn Sie nur einen bestimmten Typ wünschen (z. B. beliebige 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.

19
tegan
for entry in "$search_dir"/* "$work_dir"/*
do
  if [ -f "$entry" ];then
    echo "$entry"
  fi
done
17
ghostdog74

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

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

./ ist das aktuelle Arbeitsverzeichnis, kann jedoch durch einen beliebigen Pfad ersetzt werden
*.txt gibt any.txt zurück
Sie können leicht überprüfen, was aufgelistet wird, indem Sie den Befehl ls direkt in das Terminal eingeben.

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

11
rrr
find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}"
10
November Yankee
$ pwd; ls -l
/home/victoria/test
total 12
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  a
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  b
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  c
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:32 'c d'
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:31  d
drwxr-xr-x 2 victoria victoria 4096 Apr 23 11:32  dir_a
drwxr-xr-x 2 victoria victoria 4096 Apr 23 11:32  dir_b
-rw-r--r-- 1 victoria victoria    0 Apr 23 11:32 'e; f'

$ find . -type f
./c
./b
./a
./d
./c d
./e; f

$ find . -type f | sed 's/^\.\///g' | sort
a
b
c
c d
d
e; f

$ find . -type f | sed 's/^\.\///g' | sort > tmp

$ cat tmp
a
b
c
c d
d
e; f

Variationen

$ pwd
/home/victoria

$ find $(pwd) -maxdepth 1 -type f -not -path '*/\.*' | sort
/home/victoria/new
/home/victoria/new1
/home/victoria/new2
/home/victoria/new3
/home/victoria/new3.md
/home/victoria/new.md
/home/victoria/package.json
/home/victoria/Untitled Document 1
/home/victoria/Untitled Document 2

$ find . -maxdepth 1 -type f -not -path '*/\.*' | sed 's/^\.\///g' | sort
new
new1
new2
new3
new3.md
new.md
package.json
Untitled Document 1
Untitled Document 2

Anmerkungen:

  • .: aktueller Ordner
  • entferne -maxdepth 1 um rekursiv zu suchen
  • -type f: Finde Dateien, keine Verzeichnisse (d)
  • -not -path '*/\.*': .hidden_files nicht zurückgeben
  • sed 's/^\.\///g': Entfernen Sie den vorangestellten ./ aus der Ergebnisliste
1
Victoria Stuart

Die akzeptierte Antwort gibt kein Dateipräfix mit einem zurück. Verwenden Sie dazu

for entry in "$search_dir"/* "$search_dir"/.[!.]* "$search_dir"/..?*
do
  echo "$entry"
done
0
TrevTheDev

Hier ist eine weitere Möglichkeit, Dateien in einem Verzeichnis aufzulisten (mit einem anderen Tool, nicht so effizient wie einige andere Antworten).

cd "search_dir"
for [ z in `echo *` ]; do
    echo "$z"
done

echo * Gibt alle Dateien des aktuellen Verzeichnisses aus. Die for-Schleife durchläuft jeden Dateinamen und druckt in stdout.

Wenn Sie außerdem nach Verzeichnissen im Verzeichnis suchen, platzieren Sie diese in der for-Schleife:

if [ test -d $z ]; then
    echo "$z is a directory"
fi

test -d prüft, ob es sich bei der Datei um ein Verzeichnis handelt.

0
SnoopDogg

An der Linux-Version arbeite ich mit (x86_64 GNU/Linux) folgenden Arbeiten:

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