ハードウェア技術者のスキルアップ日誌

某家電メーカーの技術者がスキルアップのために勉強したことを記録するブログです

シェルスクリプト - フォルダ内の全ファイルに対して処理

シェルスクリプトを作るときにフォルダ内の各ファイルに対して同じ処理を繰り返す場合が多いのですが、よく書き方が分からなくなるので、備忘録として記録しておきます。

シェルスクリプトのサンプル

以下はフォルダ内の各mp4ファイルを引数にしてsample.pyを実行するものです。
シェルスクリプトの引数に対象フォルダのパスを指定して実行します。

#!/bin/bash
[ "x$1" = "x" ] && exit 1
#引数にファイルパスを代入
DIR=$1

for file in `\find $DIR -name '*.mp4'`; do
  #echo $file
 python sample.py $file
done

各行の解説

[ "x$1" = "x" ] && exit 1

"x$1"と"x"が等しい、即ち$1(スクリプトの第一引数)が指定されてないときに
エラーで終了する。

DIR=$1

$1(スクリプトの第一引数)を変数DIRに代入する。

for file in `\find $DIR -name '*.mp4'`; do

` `内の条件を満たすものを変数fileに代入し、条件に満足するものがなくなるまで
do - done内の処理を繰り返す。
` `は内側の処理を行った結果で置換する記述で$()でも同じ。
findコマンドでDIRで指定したディレクトリ内のファイル名がmp4で終わるものを検索。
この検索結果をひとつずつ変数findに代入する。
ディレクトリの階層が深くてもすべて抽出して実行可能。
逆にサブディレクトリは処理したくない場合は-maxdepthオプションで1を指定する。

#echo $file

対象ファイルが正しく取れているかの確認のため、ファイル名を表示。
デバッグ用のため、コメントアウト

python sample.py $file

抽出したファイル名を引数にしてsample.pyを実行する。

応用

find文の検索条件を変えたり、forループの中を変えることでいろいろな処理に応用できると思います。自動でたくさんのファイルを処理したい場合に活用したいと思います。