2016-08-03 14 views
2

zu überprüfen Ich möchte wissen, wie ich suchen würde ... lets Textdateien in einem bestimmten Verzeichnis. Ich möchte alle Dateien in meinem Verzeichnis durchlaufen, und für jede Textdatei möchte ich sie in eine PDF-Datei konvertieren. Problem ist, ich weiß nicht, wie man überprüft, ob eine Datei eine Textdatei innerhalb der Parameter einer if-Anweisung in der Bash-Shell ist.Wie nach bestimmten Dateitypen in einer if-Anweisung mit Bash-Shell

ich meine ListOfFiles=`ls -l` und ich iterieren mit einer for Schleife durch, ich muß nur wissen, wie für Dateitypen in einer if Aussage zu überprüfen.

Vielen Dank im Voraus.

+3

Sehen http://mywiki.wooledge.org/ParsingLs - Sie nicht 'ls' in Skripten verwenden sollten; Globbing ist sowohl effizienter (keine Programme außerhalb der Shell erforderlich, während '/ bin/ls' eine separate ausführbare Datei ist) und korrekter (siehe Link). –

+3

... Die Antwort von @ mklement0 enthält eine Verzweigung mit Kompromissen, die für die Leistung über die Korrektheit gemacht wurden, aber zumindest ist es eine bewusste Entscheidung, und Sie erhalten etwas als Gegenleistung. (Persönlich würde ich diese Wahl nicht treffen - das Erstellen einer PDF ist so teuer, dass die Kosten für den Aufruf von "Datei" auf Kandidaten fast als Prozentsatz der Gesamtkosten verschwinden, es sei denn, Sie machen etwas Ineffektives wie das Ausführen über alle Dateien hinweg , im Gegensatz zu nur neuen, auf einer regulären/gestaffelten Basis). –

Antwort

3

Im Folgenden werden alle Textdateien im aktuellen Verzeichnis aufgelistet.

file --mime-type * -F$'\t' | awk -F'\t *' '$2 ~/^text\/plain/ { print $1 }' 

Hinweis: Dies setzt voraus, dass Ihre Dateinamen haben weder eingebettete Registerkarten noch eingebettet Zeilenumbrüche, die normalerweise nicht ein Problem ist.

  • file --mime-type * -F$'\t' bestimmt den Dateityp einer jede Datei in dem aktuellen Ordner (*) und druckt eine zweispaltige Liste: die Dateinamen auf der Hand, durch eine Lasche, gefolgt (-F'$\t'), durch Zwischenräume für die Ausrichtung gefolgt, gefolgt vom Dateityp, der als MIME-Typ ausgedrückt wird.

  • awk -F'\t *' '$2 ~/^text\/plain/ { print $1 }' dann jede Zeile in den Typ Dateinamen und MIME parst (-F'\t *), prüft, ob der MIME-Typ (Feld 2, $2) beginnt mit (^) string text/plain, und wenn ja, druckt der Dateiname (Feld 1, $1).

Um die resultierenden Dateien in einer Schleife zu verarbeiten, verwenden while:

while IFS= read -r textfile; do 
    # Work with "$textfile" 
done < <(file --mime-type * -F$'\t' | awk -F'\t *' '$2 ~/^text\/plain/ { print $1 }') 

Beachten Sie, dass, während Sie konnte Anruf file in einem bedingten innerhalb einer for file in * Schleife, der obige Ansatz ist viel effizienter.
Für die Aufzeichnung hier, wie Sie den Befehl in einem bedingten verwenden würden:

if [[ $(file -b --mime-type "$file") == 'text/plain'* ]]; then ...