2016-05-20 9 views
0

Ich habe eine Situation, wo es verschiedene Arten von Dateien (von unterschiedlicher Erweiterung) in einigen der Verzeichnisse gibt. Ich habe keine Ahnung, welcher Dateityp in einem bestimmten Verzeichnis vorhanden ist. Nehmen sich folgenden Fall annehmen:Wie Dateien nach ihrer Erweiterung zu analysieren

Es gibt einen gemeinsamen Weg für alle fünf Verzeichnisse 1, 2, 3, 4, 5, wie:

/dir1/dir2/dir3/1/ 
/dir1/dir2/dir3/2/ 
/dir1/dir2/dir3/3/ 
/dir1/dir2/dir3/4/ 
/dir1/dir2/dir3/5/ 

Kurz, 1, 2, 3, 4, 5 sind in dir3.

Als Beispiel
Verzeichnisse 1 und 3 haben Dateien mit der Erweiterung .txt
Verzeichnisse 2, 4, 5 haben Dateien mit der Erweiterung gz

ich dies ab sofort tun :

while [ $a -le 5 ] 
    do 
     cat /dir1/dir2/dir3/"$a"/*.txt | grep "string" > /path/output"$a" 
     zcat -f /dir1/dir2/dir3/"$a"/*.gz | grep "string" > /path/output"$a" 
     ((a++)) 
    done 

Ausgänge werden erstellt, aber nur wenige von ihnen sind leer. Ich bin sicher, dass die Eingaben die Zeichenfolge haben, die ich in grep verwendet habe. Ich denke, das Skript, das ich verwende, überschreibt die Dateien.

Wie kann ich dies durchführen, indem ich zuerst die Dateiendung durchsuche und entweder cat oder zcat entsprechend ausführe? Bitte vorschlagen?

Edit:

Ich habe auch versucht, die folgenden:

while [ $a -le 5 ] 
    do 

for f in /dir1/dir2/dir3/"$a"/*.txt 
    do 
     cat $f | grep "string" > /path/output"$a" 
    done 
for f in /dir1/dir2/dir3/"$a"/*.gz 
    do 
     cat $f | grep "string" > /path/output"$a" 
    done 

done 
+0

Ihr bearbeiteter Versuch sollte so lange funktionieren, wie Sie 'shopt -s nullglob' verwenden. Dies verhindert, dass die eine oder die andere "for" -Schleife überhaupt betreten wird. Wenn Sie, aus welchen Gründen auch immer, mit 'gz'- und' txt'-Dateien im selben Verzeichnis enden, überschreibt das Ergebnis der 'gz'-Schleife das Ergebnis der' txt'-Schleife. – chepner

+0

@chepner Ja. Es funktioniert gut, wenn ich die Ausgabe in verschiedene Verzeichnisse umleite - eins für .txt und eins für .gz. – intruder

Antwort

1

Sammeln Sie alle txt-Dateien in einem Array, und wenn das Array nicht leer ist, laufen cat. Führen Sie andernfalls zcat aus. Die Ausgabe dessen, was tatsächlich ausgeführt wird, wird in die Ausgabedatei umgeleitet.

shopt -s nullglob 
for d in 1 2 3 4 5; do 
    txt=(/dir1/dir2/dir3/"$d"/*.txt) 
    if ((${#txt[@]})); then 
     grep "string" "${txt[@]}" 
    else 
     zcat -f /dir1/dir2/dir3/"$a"/*.gz | grep "string" 
    fi > /path/output/"$d" 
done