任意の拡張子のファイルを除いてディレクトリをまるごとコピーするには

拡張子.aaaと.bbbを除いてディレクトリをコピーする

bashの場合

findの結果をみてディレクトリならmkdirをそうでないときにコピーする

$ for i in `find . -not -name "*.aaa" -not -name "*.bbb"`; do echo $i ;if [ -d $i ]; then mkdir -p target/$i ; else cp $i target/$i ;fi ; done

拡張子の取り出しをbash側で行う場合 #{変数名##*.} を使うといい

$ for i in `find .`; do if [ -d $i ]; then echo $i; mkdir -p target/$i; elif [ ${i##*.} != "aaa" -a ${i##*.} != "bbb" ]; then cp $i target/$i; fi; done

awk使ってもいいのだがあまり効果が無い。##*.を覚えてなくていいだけマシか…

$ for i in `find . | awk '!/.aaa|.bbb/`; do if [ -d $i ]; then mkdir -p target/$i;else cp $i target/$i; fi; done

grepでもいい。

find .|grep -v '\(.aaa\|.bbb\)'

zshの場合

`find .` を **/* にすればOK あまりzshである意味が無かったな。
zshから外部コマンドを読んでしまうとbashとの相異がなくなってしまう。

% for i in **/*
do if [ -d $i ]
then mkdir -p target/$i
elif [ ${i##*.} != "aaa" -a ${i##*.} != "bbb" ]
then cp $i target/$i
fi
done

zargsやxargsを使うパターンもあまり意味がなさそうだしな。
この辺で終わろう。


ちなみにwindowsならxcopyをexcudeオプションで使うとOK