Question

J'écris un script de construction nocturne en bash.
Tout va bien et dandy à l'exception d'un petit problème:


#!/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;

Mon problème est de déterminer l’extension du fichier puis d’agir en conséquence. Je sais que le problème est dans la déclaration if, à la recherche d'un fichier txt.

Comment puis-je déterminer si un fichier a un suffixe .txt?

Était-ce utile?

La solution

Je pense que vous voulez dire & "Les quatre derniers caractères de $ fichier sont-ils égaux à .txt? &"; Si tel est le cas, vous pouvez utiliser les éléments suivants:

if [ ${file: -4} == ".txt" ]

Notez que l'espace entre file: et -4 est requis car le modificateur ': -' signifie quelque chose de différent.

Autres conseils

Faire

if [ "$file" == "*.txt" ]

comme ceci:

if [[ $file == *.txt ]]

C'est-à-dire des doubles crochets et pas de guillemets.

Le côté droit de == est un motif de coque. Si vous avez besoin d'une expression régulière, utilisez =~ puis.

Sur un système Unix, vous ne pouvez pas être sûr qu'un fichier .txt est vraiment un fichier texte. Votre meilleur choix est d’utiliser & "Fichier &"; Essayez peut-être d’utiliser:

file -ib "$file"

Ensuite, vous pouvez utiliser une liste de types MIME à comparer ou analyser la première partie du MIME où vous obtenez des éléments tels que & "texte &", & "application &" ;, etc.

Vous pouvez utiliser le fichier " " commande si vous voulez réellement trouver des informations sur le fichier plutôt que de vous fier aux extensions.

Si vous préférez utiliser l'extension, vous pouvez utiliser grep pour voir si elle correspond.

Vous pouvez également faire:

   if [ "${FILE##*.}" = "txt" ]; then
       # operation for txt files here
   fi

Semblable à "fichier", utilisez le "type MIME -b" légèrement plus simple qui fonctionnera quelle que soit l'extension du fichier.

if [ $(mimetype -b "$MyFile") == "text/plain" ]
then
  echo "this is a text file"
fi

Éditer: vous devrez peut-être installer libfile-mimeinfo-perl sur votre système si le type MIME n'est pas disponible

J'ai écrit un script bash qui examine le type d'un fichier puis le copie dans un emplacement. Je l'utilise pour parcourir les vidéos que j'ai visionnées en ligne à partir de mon cache firefox:

#!/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"&

Il utilise des idées similaires à celles présentées ici. J'espère que cela sera utile à quelqu'un.

Je suppose que '$PATH_TO_SOMEWHERE' est quelque chose comme '<directory>/*'.

Dans ce cas, je changerais le code en:

find <directory> -maxdepth 1 -type d -exec ... \;
find <directory> -maxdepth 1 -type f -name "*.txt" -exec ... \;

Si vous voulez faire quelque chose de plus compliqué avec les noms de répertoire et de fichier texte, vous pouvez:

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

Si vos noms de fichiers comportent des espaces, vous pouvez:

find <directory> -maxdepth 1 -type d | xargs ...
find <directory> -maxdepth 1 -type f -name "*.txt" | xargs ...

La bonne réponse pour utiliser l'extension disponible dans un nom de fichier sous Linux est la suivante:

${strFileName##*\\.} 

Exemple d'impression de toutes les extensions de fichier d'un répertoire

for fname in $(find . -maxdepth 1 -type f) # only regular file in the current dir
    do  echo ${fname##*\.} #print extensions 
done

Mon point de vue avec coupe

>cut -d'.' -f2<<<"hi_mom.txt"
txt

Mon point de vue sur awk ressemblerait à ce qui suit.

>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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top