私は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サフィックスが付いているかどうかを確認するにはどうすればよいですか?
「$ fileの最後の4文字は.txt
と等しいですか?」と言いたいと思います。その場合、次を使用できます。
if [ ${file: -4} == ".txt" ]
':-'修飾子は何か異なることを意味するため、file:
と-4
の間にはスペースが必要です。
Make
if [ "$file" == "*.txt" ]
このような:
if [[ $file == *.txt ]]
つまり、二重括弧と引用符はありません。
==
の右側は、シェルパターンです。正規表現が必要な場合は、=~
thenを使用します。
Unixシステムでは、.txtファイルが本当にテキストファイルであるかを確認することはできません。あなたの最善の策は、「ファイル」を使用することです。たぶん使用してみてください:
file -ib "$file"
次に、MIMEタイプのリストを使用して、「テキスト」、「アプリケーション」などの情報を取得するMIMEの最初の部分を照合または解析できます。
拡張子に依存するのではなく、ファイルに関する情報を実際に知りたい場合は、「file」コマンドを使用できます。
拡張機能の使用に慣れている場合は、grepを使用して一致するかどうかを確認できます。
次のこともできます。
if [ "${FILE##*.}" = "txt" ]; then
# operation for txt files here
fi
「ファイル」と同様に、ファイル拡張子に関係なく機能する、少し単純な「mimetype -b」を使用します。
if [ $(mimetype -b "$MyFile") == "text/plain" ]
then
echo "this is a text file"
fi
編集:mimetypeが利用できない場合、システムにlibfile-mimeinfo-Perlをインストールする必要があるかもしれません
ファイルのタイプを調べて場所にコピーする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"&
ここで紹介したものと同様のアイデアを使用しています。これが誰かに役立つことを願っています。
Linuxでファイル名に含まれる拡張子を取得する方法についての正しい答えは次のとおりです。
${strFileName##*\\.}
ディレクトリ内のすべてのファイル拡張子を印刷する例
for fname in $(find . -maxdepth 1 -type f) # only regular file in the current dir
do echo ${fname##*\.} #print extensions
done
'$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 ...
カットでそれを取る
>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