2016-06-07 9 views
1

Ich schreibe ein Skript, das alle .gz-Dateien in jedem Verzeichnis findet. Der folgende Code funktioniert im Terminal, stürzt aber beim Ausführen des Shell-Skripts ab.Bash-Shell-Skript: f: Befehl nicht gefunden

#!/bin/bash 

# Find all directories in Output directory 
dirs=($(find ~/Documents/MainDir/$(date +%Y-%m-%d)/Output -type d)) && wait 

# Concatenate all .gz files in a dir, unzip gzip & remove unwanted files 
for dir in $dirs 
do 
    if f in $(find . -name "*.gz") 
    then 
     cd $dir; cat *.gz > output.gz && gunzip -d output.gz && find . -type f -not -name 'output' | xargs rm 
    fi 
done 

Zuerst habe ich versucht, das Skript auszuführen, ohne ‚zu tun‘, die in

führten
syntax error near unexpected token `if' 
`if f in $(find . -name "*.gz")' 

Nach dem Hinzufügen tue ich die folgende Fehlermeldung erhalten:

f: command not found 

Wie beheben dieses Problem? Thx

+2

Verwenden http://www.shellcheck.net/ und es ist 'für ... in'' nicht, wenn ... in' – user3439894

+0

andlrc, 'wenn f in $ (find. -name "* .gz") '** ist keine korrekte Form ** einer' if'_Anweisung_! Schauen Sie sich [7.1. Einführung in if] (http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html) und [Bedingt (Computerprogrammierung)] (https://en.wikipedia.org/wiki/Conditional_ (computer_programming)) – user3439894

+0

@andlrc, ich habe nie das _keyword_ 'in' in Verbindung mit dem _keyword_' if' wie im OP gesehen, noch wird es in einem der beiden Links meines vorherigen Kommentars verwendet. Sofern Sie keine gültige _boolean condition_ 'if'-Anweisung angeben können, die auch das _keyword_' in' verwendet, in dem ich mit ... testen kann, muss ich zu meinen vorherigen Kommentaren stehen. Ich bin zwar bereit, mich zu lehnen, aber ich sehe nichts richtiges in 'if f in $ (find. -name" * .gz ")' als korrekte und/oder richtige Form einer 'if'-Anweisung_! – user3439894

Antwort

0

Ein anderer Weg, dies umgehen konnte eine erweiterte Nutzung des Fundes Befehls haben sein, unter Ausnutzung der Prädikate und die -exec Optionen, die einen Befehl für jede passende Datei ausführen können angetroffen werden, wie zum Beispiel:

rm $dir/output.gz 
find $dir -name "*.gz" -a ! -name "output.gz" -exec cat \{\} > $dir/output.gz && rm \{\} \; 

(nicht überprüft Code)