Wie werden die spezifischen Dateien aus einem Verzeichnis in einem Array in Bash abgelegt?

7

Angenommen, ich habe ein Verzeichnis, in dem sich drei Dateien mit dem Namen file1.txt, file2.txt und file3.txt befinden.

Wie kann ich nun ein Array mit diesen Dateinamen füllen (ich weiß nur, dass alle Dateien ein bestimmtes Präfix haben, dh Datei, nach Datei kann es 1,2,3 usw. sein).

Nawshad Farruque
quelle
Wenn Sie die Namen kennen, was meinen Sie mit "finden"? Möchten Sie ein Array mit diesen drei Zeichenfolgen erstellen?
Matteo
A = (Datei *); Echo $ {A [@]}
Gänseblümchen
Ich habe meine Erklärung oben bearbeitet.
Nawshad Farruque

Antworten:

8

Aus Gregs Wiki: Der Bash Guide- Eintrag zu Arrays :

files=()
while read -r -d $'\0'; do
    files+=("$REPLY")
done < <(find *.txt -print0)

Auf der Seite finden Sie eine detaillierte Erläuterung der Arrays, die dieses Konstrukt Element für Element aufteilen. es lohnt sich, es vollständig zu lesen.

Jasonwryan
quelle
Suchen wird in Ihrem Beispiel nicht benötigt, aber es wird immer noch die Aufgabe erledigt, eine sichere Methode zum Auffüllen eines Arrays +1 mithilfe von Suchen zu demonstrieren. Ein Hinweis ist, dass nicht alle Versionen von find support -print0 unterstützen.
Jordanm
Du hast recht. Angesichts des Mangels an Details zum eigentlichen Problem hielt ich es für besser, das OP für eine gründlichere Erklärung an das Wooledge-Wiki weiterzuleiten.
Jasonwryan
Als Stammgast im #bash IRC-Kanal, dessen Mitglieder dieses Wiki pflegen, stimme ich zu.
Jordan
5

Wenn sich alle Dateien im selben Verzeichnis befinden, haben Sie neben der Antwort von jasonwryan noch einige andere Optionen.

Verwenden eines Globus:

files=(file[0-9].txt)

Nur passend zu den Beispieldateien in der Frage:

files=(file[1-3].txt)

Wenn Sie Bash Version 4 oder höher haben, können Sie sogar rekursiv glob:

shopt -s globstar
files=(**/file[0-9].txt)

Verwenden der Klammererweiterung, um Ihr Array nur auf Ihre Beispieldateien zu beschränken:

files=(file{1..3}.txt)

Im Gegensatz zu den beiden anderen Beispielen wird das Array mit den Dateinamen gefüllt, auch wenn diese nicht vorhanden sind. Aus diesem Grund ist die Streckenexpansion möglicherweise nicht wünschenswert.

Jordanm
quelle