各カテゴリテキスト(コードスクリプトとsrcファイルを含む)、ビデオ、サウンド、画像ファイルに4つのforループを使用したいと思います。
同様の検査を実行するための明示的な検査拡張
for i in *.ext1 *.ext2 *.ext...
各カテゴリに対して可能なすべての拡張を指定する必要があり、選択肢を探しています。
答え1
他の方法がないのか怖いです。 *nixシステムでは、おそらく使用しているすべてのオペレーティングシステムでは、拡張は通常オプションであり、外観上であることに注意してください。これは、拡張子がまったくないファイルを持つことができることを意味します。
$ ls
foo1 foo10 foo2 foo3 foo4 foo5 foo6 foo7 foo8 foo9
$ for file in *; do file "$file"; done
foo1: PNG image data, 25 x 25, 8-bit/color RGBA, non-interlaced
foo10: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 8 bit, mono 22050 Hz
foo2: GIF image data, version 89a, 500 x 225
foo3: HTML document, Unicode text, UTF-8 text, with very long lines (1207)
foo4: MPEG sequence, v2, program multiplex
foo5: Ogg data, Vorbis audio, stereo, 44100 Hz, ~128000 bps
foo6: Audio file with ID3 version 2.2.0, contains: MPEG ADTS, layer III, v1, 160 kbps, 44.1 kHz, JntStereo
foo7: ISO Media, Apple QuickTime movie, Apple QuickTime (.MOV/QT)
foo8: RIFF (little-endian) data, AVI, 640 x 480, 30.00 fps, video: FFMpeg MPEG-4, audio: MPEG-1 Layer 3 (mono, 44100 Hz)
foo9: ASCII text
したがって、唯一のオプションは、ファイル形式を抽出し、上記のカテゴリのいずれかに分類するプログラムを作成することです。そのようなツールが存在する場合、私はそれについて知らない。
本当にファイルを作成したい場合は、file
上記の方法から始めて、どのファイル形式がどのカテゴリに属するかを定義し、そこからインポートするだけです。ただし、これを実行できるシェルの基本的な方法はありません。
答え2
@terdonの答え(簡単に「ファイルを使用する」)に基づいて、次のことができます。
file --mime-type * |
awk -F': ' '$2 ~ /^video/ { system("process_video_file.sh " $1) ; next };
$2 ~ /^image/ { system("process_image_file.sh " $1) ; next };
$2 ~ /^audio/ { system("process_audio_file.sh " $1) ; next };
{ print "$1: unknown file type $2" }'
もちろん、およびスクリプトで書く必要がありprocess_video_file.sh
ます。process_image_file.sh
process_audio_file.sh
注:この場合、:
改行やシーケンス(コロンとスペース)を含むファイル名が破損する可能性がありますが、発生する可能性は低くても不可能ではありません。
または、シェルで次の操作を実行できます。
while read -r f ft ; do
case "$ft" in
video*) process_video_file "$f" ;;
image*) process_image_file "$f" ;;
audio*) process_audio_file "$f" ;;
*) echo "$f: unknown file type $ft" ;;
esac
done < <(file --mime-type * | sed -e 's/: /\t/')
これはシェルスクリプトにあるため、「process_(video | image | audio)_file」を別のシェルスクリプトとして作成したり、同じスクリプトで定義されているシェル関数で作成したりできます。 Caseステートメントに含めることもできます(ただし、Caseごとに複数のステートメントがある場合は、コードを読み取れないかメンテナンスできなくなる可能性があります)。
注:これにより、ファイル名はスペース、改行、タブ、またはawkバージョンと同じコロンとスペースの順序で区切られます。
これらのファイル名の問題を避けるために、このファイル(またはawkバージョン)を再構築することは難しくありませんが、私の答えの目的は、完全なスクリプトを書くのではなく、自分で解決できるいくつかの可能なガイドラインを示すことです。
より洗練された選択肢は、perlと複数のperlモジュールのいずれかを使用してファイルのMIMEタイプを決定することです。例:ファイルタイプまたはファイル::Mime情報。
これらのいずれもシェルにないため、ファイル名のシェル引用符やトークン化の問題は発生しません(つまり、ファイル名に問題なく有効な文字を含めることができます)。これはfile
awkやシェルを使用するよりももはや仕事ではなく、難しくありません。
Perlについてさらに詳しく知りたい場合は、Perlにはマルチメディアファイルのメタデータを処理するための素晴らしいライブラリもあります。画像::Exiftool(画像ファイルでのみ動作するわけではないので、名前にだまさないでください)またはビデオ::情報またはオーディオ::ファイル。
Perlには、外部オーディオまたはビデオ処理ツールとCライブラリへのインターフェースもあります。同様の機能を持つライブラリもPythonで利用できます。これには、処理中のファイルの種類を特定し、実際の処理を他のプログラムに渡す高速で汚れたスクリプトよりも多くの作業が必要ですが、同様の作業を行う必要がある場合に可能です。努力する価値があるか、努力する必要があります。既存のツールが実行しない、または必要な方法で機能しない方法でファイルを処理します。