tuneoの日記: シェル力を高める:除外リストの要素をリストから削除する 4
日記 by
tuneo
あるディレクトリの中にあるファイルをシェルスクリプトを使って一括で処理したいんだけど、exclude_files変数に指定したファイル(複数可)は除外する、というようなことをやりたい。とりあえずは、
dir=/dir/of/files/
files=$dir/*
exclude_files=foo.txt bar.dat baz.jpg
echo $exclude_files | while read exf; do
files=$(echo $files | sed -e 's:$dir/$exf::g')
done
for f in $files; do
boofoowoo $f
done
と書いてみてるんだけど、どうにも好かない。Pythonだとfiles = [f for f in files if f not in exclude_files]の一行で書き飛ばせる処理なんで、上記のシェルスクリプトには煩雑という感想しか抱けないのだが、もうちょっとなんとかならないものだろうか。
sedは不要では? (スコア:1)
list="A B C D"
exclude="B D"
for x in $exclude; do
list=${list/$x/}
done
echo $list
Re:sedは不要では? (スコア:1)
変数展開しつつ置換ですか、そいつは思い至りませんでした。
しかしループは回さないとダメですかね。ダメですよね。
Re:sedは不要では? (スコア:1)
exclude="foo.txt bar.dat baz.jpg"
shopt -s extglob
echo ./!(${exclude// /|})
とかですかね.試してないですが.
grepしちゃう (スコア:1)
自分だったら、
files=`ls $dir | fgrep -xvf $file_of_exclude_files`
ってやっちゃうかなぁ。