web-dev-qa-db-ja.com

bashスクリプトでファイル名の拡張子を確認する方法は?

私はbashで毎晩ビルドスクリプトを書いています。
1つの小さな障害を除いて、すべてがうまくできています。


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

私の問題は、ファイル拡張子を特定し、それに応じて行動することです。問題はif文にあり、txtファイルをテストしていることを知っています。

ファイルに.txtサフィックスが付いているかどうかを確認するにはどうすればよいですか?

145
theman_on_vista

「$ fileの最後の4文字は.txtと等しいですか?」と言いたいと思います。その場合、次を使用できます。

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

':-'修飾子は何か異なることを意味するため、file:-4の間にはスペースが必要です。

211
Paul Stephenson

Make

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

このような:

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

つまり、二重括弧と引用符はありません。

==の右側は、シェルパターンです。正規表現が必要な場合は、=~ thenを使用します。

233
user49586

Unixシステムでは、.txtファイルが本当にテキストファイルであるかを確認することはできません。あなたの最善の策は、「ファイル」を使用することです。たぶん使用してみてください:

file -ib "$file"

次に、MIMEタイプのリストを使用して、「テキスト」、「アプリケーション」などの情報を取得するMIMEの最初の部分を照合または解析できます。

25
Eldelshell

拡張子に依存するのではなく、ファイルに関する情報を実際に知りたい場合は、「file」コマンドを使用できます。

拡張機能の使用に慣れている場合は、grepを使用して一致するかどうかを確認できます。

24
Adam Peck

次のこともできます。

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

「ファイル」と同様に、ファイル拡張子に関係なく機能する、少し単純な「mimetype -b」を使用します。

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

編集:mimetypeが利用できない場合、システムにlibfile-mimeinfo-Perlをインストールする必要があるかもしれません

8
dargaud

ファイルのタイプを調べて場所にコピーするbashスクリプトを作成し、それを使用して、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"&

ここで紹介したものと同様のアイデアを使用しています。これが誰かに役立つことを願っています。

3
desdecode

Linuxでファイル名に含まれる拡張子を取得する方法についての正しい答えは次のとおりです。

${strFileName##*\\.} 

ディレクトリ内のすべてのファイル拡張子を印刷する例

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

'$PATH_TO_SOMEWHERE''<directory>/*'のようなものだと思います。

この場合、コードを次のように変更します。

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

ディレクトリ名とテキストファイル名を使用してより複雑な操作を行いたい場合は、次のことができます。

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

ファイル名にスペースがある場合、次のことができます。

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

カットでそれを取る

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

Awkでの私の考えは次のようなものです。

>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
1
John Babb