2016-03-31 23 views
0

Ich muss alle Dateinamen von Dateien, die ASCII-Text aus einem bestimmten Ordner sind, sortieren und drucken. Ich habe dies bisher gemacht, aber die Dateinamen werden gedruckt, auch wenn sie PNG-Bilder sind.Ermitteln, ob der Dateityp ASCII-Text in Bash ist

#!/bin/bash 

for f in $1/* 
do 
nume=$(basename $f) 

if [ 'file $nume'=="$1/$nume: ASCII text" ]; then 
    echo $nume 
fi 
done 

Kann jemand bitte what`s falsch mit meinem Code erklären?

+1

Haben Sie verstehen, warum '$ (...) 'wird' basename' verwendet? Der gleiche Grund gilt für das Ausführen von 'file'. – chepner

Antwort

3
  1. [ will nur ein Gleichheitszeichen, nicht zwei, und es muss durch Leerzeichen getrennt werden (siehe help test):

    [ 'file $nume' = "$1/$nume: ASCII text" ] 
    
  2. Sie $(...) brauchen die Ausgabe eines Befehls zu erhalten:

    [ "$(file $nume)" = "$1/$nume: ASCII text" ] 
    
  3. Warum verwenden Sie basename? file wird nicht die Dateien finden, wenn Sie es den ganzen Weg nicht geben:

    for f in $1/* 
    do 
        if [ "$(file $f)" = "$f: ASCII text" ]; then 
         echo $f 
        fi 
    done 
    
  4. immer Ihre Erweiterungen zitieren. Zitiert können Sie eine Menge Kopfschmerzen sparen:

    for f in "$1"/* 
    do 
        if [ "$(file "$f")" = "$f: ASCII text" ]; then 
         echo "$f" 
        fi 
    done 
    
  5. (Optional) Ich persönlich Vorteil [[ und Regex Matching nehmen würde:

    if [[ "$(file "$f")" =~ ': ASCII text'$ ]]; then 
    
+0

6. Ich würde den Vorteil von 'case $ (Datei "$ f") in * text) echo matched text ;; *) echo keine Übereinstimmung auf Text ;; esac'; -) Beachten Sie, dass Sie auch bei einem fileName, der Leerzeichen enthält, nur "$ f" dbl-quote angeben müssen, nicht die gesamte Ausgabe von '$ (Datei" $ f ")'. Viel Glück für jeden. – shellter