トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

findとxargs

[shell]

Bash等の覚え書き

いろいろ考えた結果、ファイルパスをbash配列に保存するのは結構デバッグ等が面倒くさい感じ

空白文字を含むファイルの処理の例外処理がすごく面倒

  find + xargs

  • 例外を考慮しない単純な書き方
    • zipファイルをfindで検索して解凍する
FILES=(`find ${1} -name \*.zip -print`)

for zip in ${FILES[@]}
do
    unzip "${zip}"
done

空白文字を含むパス

これだと、例えば "[20111211] CG.zip" みたいなファイルが存在した場合

do~done節で

unzip "[20111211]"
unzip "CG.zip"

のように処理される。なんてやりづらいんだ。。。

ワークアラウンド

  • 以下のようにすれば配列を作る際のセパレーターが変わるので、純粋に改行のみで区切れる
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

FILES=(`find ${1} -name \*.zip -print`)

for zip in ${FILES[@]}
do
    unzip "${zip}"
done

IFS=$SAVEIFS

もっとプログラムに正確性を要求される場合はPerlやRuby, Pythonなどを使用するべきかもしれない。でもたいていこういう場合は労力のわりにやることはちょっぴりだったりするから微妙。

  find -exec ... {} +

  • xargsのような機能をfind自身がもっているようだ、これを使えば並列実行もできる?
find ${1} -name \*.zip -exec unzip {} +
お名前: コメント: