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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top