2016-11-07 2 views
1

Ich möchte in der Lage sein, den Inhalt eines Verzeichnisses innerhalb eines Arrays zu speichern. Ich weiß, dass Sie verwenden können:So speichern Sie den Inhalt eines Verzeichnisses innerhalb eines Arrays

#!/bin/bash 

declare -A array 

for i in Directory; do 
    array[$i]=$i 
done 

, um Verzeichnisinhalte in einem assoziativen Array zu speichern. Aber wenn es Unterverzeichnisse innerhalb eines Verzeichnisses gibt, möchte ich in der Lage sein, sie und ihren Inhalt innerhalb desselben Arrays zu speichern. Ich habe auch versucht mit:

declare -A arr1  

find Directory -print0 | while read -d $'\0' file; do 
     arr1[$file]=$file 
     echo "${arr1[$file]}" 
    done 

aber das läuft nur in das Problem, bei dem der Inhalt des Arrays verschwinden, sobald die while-Schleife durch Enden der Subshell aus der Pipeline verworfen (nicht sicher, ob ich beschreibe dies richtig).

Ich habe sogar versucht, die folgenden:

for i in $(find Directory/*); do 
    arr2[$i]="$i" 
    echo $i 
done 

aber die Ausgabe ist eine totale Katastrophe für Dateien keine Leerzeichen enthält.

Wie kann ich sowohl ein Verzeichnis als auch alle Unterverzeichnisse (und ggf. deren Unterverzeichnisse) in einem einzigen Array speichern?

+1

Sie können in Betracht ziehen, diesen Beitrag zu erkunden - http://stackoverflow.com/questions/11584029/how-can-i-store-a-list-of-directories-in-an-array –

+0

Siehe http: // mywiki .wooledge.org/BashGuide/Arrays – andlrc

+0

Was möchten Sie archivieren? Warum brauchen Sie ein Array? – andlrc

Antwort

0

Sie wissen also, dass Sie keine assoziativen Arrays benötigen. Ein einfacher Weg, um ein Element zu einem regulären indiziertes Array hinzuzufügen ist:

array+=("$value") 

Ihr find|while Ansatz auf dem richtigen Weg ist. Wie Sie vermutet haben, müssen Sie die Pipeline loswerden. Sie können das tun mit Prozess Substitution:

while read -d $'\0' file; do 
    arr1+=("$file") 
done < <(find Directory -print0) 

Eine andere Möglichkeit, dies ohne find zu tun ist mit Globbing. Wenn Sie nur die Dateien unter Directory wollen dann ist es so einfach wie:

array=(Directory/*) 

Wenn Sie möchten, als auch durch alle Unterverzeichnisse rekursiv, Sie globstar aktivieren und verwenden **:

shopt -s globstar 
array=(Directory/**) 

Die Globbing Methoden sind wirklich nett, weil sie automatisch Dateinamen mit Leerzeichen und anderen Sonderzeichen behandeln.

+1

Ich bin mir nicht sicher, OP ist sicher, was sie wollen, ich nehme an, die Antwort könnte sein: 'my_arr = (Directory/*)' – andlrc

+0

Der größte Nachteil der globstar und Pfadname Expansion ist, dass die erweiterten Pfadnamen im Speicher gespeichert werden (alle von ihnen). Und die Ausführung wird angehalten, bis alle Pfadnamen erweitert sind. Dies ist möglicherweise kein Problem, da OP das Ergebnis in einem Array speichern möchte. Ich habe eine offene Frage, die OP fragt, warum ein Array überhaupt benötigt wird. – andlrc

+0

@John Kugleman, danke! Prozesssubstitution funktionierte gut für das, was ich wollte. Obwohl es nicht die Syntax sein soll, die während des Lesens der Datei -d $ '\ 0' lautet; do arr1 + = ("$ datei") done <<(find Directory -print0) '' – Alphatron

-2

Verwenden Sie einen rekursiven Aufruf. Etwas wie folgt aus:

My_function(array, Directory) { 
    for i in Directory; do 
     If $i is a Directory; do 
      My_function(array,$1) 
     Done 
     Else 
      array.add=$i 
     done 
} 

Sie müssen überprüfen, wie Sie einen Eintrag in das Array hinzufügen und wie Sie überprüfen, ob ein Eintrag oder ist kein Verzeichnis.

+0

Ist das Pseudocode? Das ist kein Bash-Skript. –

Verwandte Themen