Ich schreibe ein nächtliches Build-Skript in Bash.
Alles ist gut und gut, bis auf einen kleinen Haken:
#!/bin/bash
for file in "$PATH_TO_SOMEWHERE"; do
if [ -d $file ]
then
# do something directory-ish
else
if [ "$file" == "*.txt" ] # this is the snag
then
# do something txt-ish
fi
fi
done;
Mein Problem besteht darin, die Dateierweiterung zu ermitteln und dann entsprechend zu handeln. Ich weiß, dass das Problem in der if-Anweisung liegt, die nach einer txt-Datei sucht.
Wie kann ich feststellen, ob eine Datei das Suffix .txt hat?
$(dirname $PATH_TO_SOMEWHERE)
und$(basename $PATH_TO_SOMEWHERE)
in Ordner und Verzeichnis aufteilen und etwas Verzeichnis-ish und file-ishAntworten:
Ich denke, Sie möchten sagen: "Sind die letzten vier Zeichen von $ file gleich
.txt
?" In diesem Fall können Sie Folgendes verwenden:Beachten Sie, dass der Abstand zwischen
file:
und-4
erforderlich ist, da der Modifikator ': -' etwas anderes bedeutet.quelle
${var:-4}
ist nicht dasselbe wie${var: -4}
; Das erste (ohne Leerzeichen) wird als '-4' erweitert, wenn var deaktiviert ist. Das zweite (mit Leerzeichen) gibt die letzten 4 Zeichen von var zurück.if [ "${file: -4}" == ".txt" ]
stattdessen.Machen
so was:
Das heißt, doppelte Klammern und keine Anführungszeichen.
Die rechte Seite
==
ist ein Muschelmuster. Wenn Sie einen regulären Ausdruck benötigen, verwenden Sie=~
dann.quelle
if
Anweisung verwenden kann. Ich teile es hier, falls es jemandem hilft.if [[ ( $file == *.csv ) || ( $file == *.png ) ]]
if [[ $file =~ .*\.(csv|png) ]]
. Es ist kürzer, übersichtlicher, einfacher, zusätzliche Erweiterungen hinzuzufügen, und kann leicht konfigurierbar gemacht werden (indem "csv | png" in eine Variable eingefügt wird).if [[ "$file" == *.txt ]]
Wenn der Name der Datei Leerzeichen enthält, ist ein doppeltes Anführungszeichen erforderlich.Auf einem Unix-System kann man einfach nicht sicher sein, dass eine TXT-Datei wirklich eine Textdatei ist. Am besten verwenden Sie "Datei". Vielleicht versuchen Sie es mit:
Anschließend können Sie eine Liste von MIME-Typen verwenden, um den ersten Teil des MIME abzugleichen oder zu analysieren, in dem Sie Informationen wie "Text", "Anwendung" usw. erhalten.
quelle
file -i...
die MIME-Codierung enthält, können Sie verwendenfile --mime-type -b ...
Sie können den Befehl "Datei" verwenden, wenn Sie tatsächlich Informationen über die Datei erhalten möchten, anstatt sich auf die Erweiterungen zu verlassen.
Wenn Sie mit der Erweiterung vertraut sind, können Sie mit grep prüfen, ob sie übereinstimmt.
quelle
file
Befehl bekannt. Ich hatte tatsächlich versucht, einen Matching basierend auf der Ausgabe des Befehls durchzuführen ... aber ich versage schrecklich bei diesen if-Anweisungen.Sie könnten auch tun:
quelle
case $FILE in *.txt ) ... ;; esac
würde robuster und idiomatischer erscheinen.Verwenden Sie ähnlich wie bei 'file' den etwas einfacheren 'mimetype -b', der unabhängig von der Dateierweiterung funktioniert.
Bearbeiten: Möglicherweise müssen Sie libfile-mimeinfo-perl auf Ihrem System installieren, wenn der Mimetyp nicht verfügbar ist
quelle
Die richtige Antwort, wie Sie die in einem Dateinamen unter Linux verfügbare Erweiterung verwenden können, lautet:
Beispiel für das Drucken aller Dateierweiterungen in einem Verzeichnis
quelle
Ich habe ein Bash-Skript geschrieben, das den Dateityp untersucht und dann an einen Speicherort kopiert. Ich verwende es, um die Videos zu durchsuchen, die ich online aus meinem Firefox-Cache angesehen habe:
Es verwendet ähnliche Ideen wie die hier vorgestellten, hoffe, dass dies für jemanden hilfreich ist.
quelle
Ich denke das
'$PATH_TO_SOMEWHERE'
ist so etwas wie'<directory>/*'
.In diesem Fall würde ich den Code ändern in:
Wenn Sie mit den Verzeichnis- und Textdateinamen etwas komplizierteres tun möchten, können Sie:
Wenn Ihre Dateinamen Leerzeichen enthalten, können Sie:
quelle
for
undwhile
Schleifen sollten besser reserviert werden, wenn der Schleifenkörper komplexer sein muss.