Wie die Erweiterung eines Dateinamens in einem Bash-Skript überprüfen?
Frage
Ich bin ein Nightly Build-Skript in bash zu schreiben.
Alles ist schön 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 ist die Bestimmung der Dateierweiterung und dann entsprechend handeln. Ich weiß, dass das Problem in der if-Anweisung ist, die Prüfung für eine txt-Datei.
Wie kann ich feststellen, ob eine Datei eine .txt-Suffix hat?
Lösung
Ich glaube, Sie sagen wollen, „Sind die letzten vier Zeichen von $ file gleich .txt
?“ Wenn ja, können Sie wie folgt vor:
if [ ${file: -4} == ".txt" ]
Beachten Sie, dass der Raum zwischen file:
und -4
erforderlich ist, wie. ‚-‘ Modifier etwas anderes bedeutet
Andere Tipps
Erstellen
if [ "$file" == "*.txt" ]
wie folgt aus:
if [[ $file == *.txt ]]
Das heißt, doppelte eckige Klammern und ohne Anführungszeichen.
Die rechte Seite des ==
ist ein Shell-Muster.
Wenn Sie einen regulären Ausdruck benötigen, verwenden =~
dann.
Sie können einfach nicht auf einem Unix-System sicher sein, dass eine TXT-Datei wirklich eine Textdatei ist. Ihre beste Wette ist „Datei“ zu verwenden. Vielleicht versuchen Sie es mit:
file -ib "$file"
Dann können Sie eine Liste der MIME-Typen verwenden gegen anzupassen oder den ersten Teil des MIME zu analysieren, wo man Sachen wie „Text“, „Anwendung“ erhalten, etc.
Sie können die „Datei“ Befehl verwenden, wenn Sie tatsächlich über die Datei, um herauszufinden, Informationen wünschen, anstatt auf den Erweiterungen verlassen.
Wenn Sie mit der Verwendung der Erweiterung wohl fühlen Sie grep verwenden können, um zu sehen, ob es passt.
Sie können auch tun:
if [ "${FILE##*.}" = "txt" ]; then
# operation for txt files here
fi
Ähnlich wie bei ‚Datei‘, verwenden Sie die etwas einfachere ‚Mimetype -b‘ Unabhängig davon, welche die Dateierweiterung funktioniert.
if [ $(mimetype -b "$MyFile") == "text/plain" ]
then
echo "this is a text file"
fi
Edit: Sie müssen libfile-mimeinfo-Perl auf Ihrem System installieren, wenn MIME-Typ nicht verfügbar ist
Ich schrieb ein Bash-Skript, das dann kopiert sie in der Art einer Datei sucht nach einem Ort, ich benutze es die Videos zu sehen, durch die ich online von meinem Firefox-Cache beobachtet haben:
#!/bin/bash
# flvcache script
CACHE=~/.mozilla/firefox/xxxxxxxx.default/Cache
OUTPUTDIR=~/Videos/flvs
MINFILESIZE=2M
for f in `find $CACHE -size +$MINFILESIZE`
do
a=$(file $f | cut -f2 -d ' ')
o=$(basename $f)
if [ "$a" = "Macromedia" ]
then
cp "$f" "$OUTPUTDIR/$o"
fi
done
nautilus "$OUTPUTDIR"&
Es nutzt ähnliche Ideen zu den hier präsentierten, hoffen, dass dies jemandem nützlich ist.
Ich denke, dass '$PATH_TO_SOMEWHERE'
is etwas wie '<directory>/*'
.
In diesem Fall würde ich den Code ändern:
find <directory> -maxdepth 1 -type d -exec ... \;
find <directory> -maxdepth 1 -type f -name "*.txt" -exec ... \;
Wenn Sie etwas komplizierter mit dem Verzeichnis und Textdateinamen tun, könnten Sie:
find <directory> -maxdepth 1 -type d | while read dir; do echo $dir; ...; done
find <directory> -maxdepth 1 -type f -name "*.txt" | while read txtfile; do echo $txtfile; ...; done
Wenn Sie Leerzeichen im Dateinamen haben, können Sie:
find <directory> -maxdepth 1 -type d | xargs ...
find <directory> -maxdepth 1 -type f -name "*.txt" | xargs ...
Die richtige Antwort, wie die Erweiterung in einem Dateinamen unter Linux zur Verfügung zu nehmen ist:
${strFileName##*\\.}
Beispiel für das Drucken aller Dateierweiterungen in einem Verzeichnis
for fname in $(find . -maxdepth 1 -type f) # only regular file in the current dir
do echo ${fname##*\.} #print extensions
done
Meine Meinung zu der sie mit Schnitt
>cut -d'.' -f2<<<"hi_mom.txt"
txt
Mein Nehmen auf es mit awk wäre so etwas wie die folgenden sein.
>MY_DATA_FILE="my_file.sql"
>FILE_EXT=$(awk -F'.' '{print $NF}' <<< $MY_DATA_FILE)
>if [ "sql" = "$FILE_EXT" ]
>then
> echo "file is sql"
>fi
>awk -F'.' '{print $NF}' <<eof
>hi_mom.txt
>my_file.jpg
>eof