
このfile
コマンドは、必要に応じてファイルの種類を決定するのに役立ちます。これらの結果を既存のファイル拡張子にマッピングする方法はありますか?
答え1
システムに登録されているファイル拡張子は必要です/etc/mime.types
。したがって、出力からファイル形式をfile
という変数に抽出すると仮定すると、type
次のように簡単に実行できます。
grep -i "$type" /etc/mime.types | awk '{$1="";print $0}'
あるいは、(コメントで提案された200_successのように)awk
これを単独で使用することもできます。
awk -v IGNORECASE=1 '/ENVIRON["type"]/{$1="";print $0}'
はい
$ type=Perl
$ grep -i "$type" /etc/mime.types | awk '{$1="";print $0}'
pl pm
答え2
これは@hildredと同じ基本的なアイデアです。回答ただし、より簡単な方法(gawk
)を使用して、スペースを含むファイル名と未知のファイル形式を処理するように修正してください。
シェルの初期化ファイルに次の行を追加します(~/.bashrc
例:実行中の場合bash
)。
get_ext(){
for f in "$@"; do
type='unknown extension';
foo=$(grep -w "$(file --mime-type "$f" | awk '{print $NF}')" /etc/mime.types |
awk -F"\t" 'NF>1{print $NF}')
[ -n "$foo" ] && type="$foo";
printf "%s\t%s\n" "$f" "$type";
done
}
これで、次のように実行できます。
$ get_ext *
cp unknown extension
file with spaces .jpg jpeg jpg jpe
foo.pl pl pm
foo.png png
foo.py py
foo.txt asc txt text pot brf srt
/etc/mime.types
関連付けられた拡張子のないファイル(例:cp
実行可能ファイル)の場合は、「不明な拡張子」を返します。
答え3
最初の拡張が正しいと仮定し、興味深い文字をカバーしない概念証明です。
file --mime-type -N *|sed \
-e 's!^\(.*: \)\(.*\)$!echo \1;grep -e \2 /etc/mime.types!e' \
-e 's!\n.*/[^ ]\+[ ]\+\([^ ]\+\).*! \1!' \
-e 's!\n\(.*/[^ ]\)\+!\1!'