空ディレクトリについての不具合の修正

前回の方法には問題がある。

$ find -name .?\* -prune -o \( -type f -print , -type d -empty -printf %p/\\n \) | sort
./articles.tex
./bylaws/
./fig-1-1.eps
$ bzr mkdir bylaws/.unofficial
bylaws/.unofficial が追加されました。
$ find -name .?\* -prune -o \( -type f -print , -type d -empty -printf %p/\\n \) | sort
./articles.tex
./fig-1-1.eps

ディレクトリ下にファイルが存在する場合、
ディレクトリは当然空ではないので表示対象から除外される。
これは動作としては正しいのではあるが、
上の例ようにディレクトリ内にドットファイルしか存在しない場合であっても、
空でないディレクトリとして扱われるので表示されなくなる。
例ではドットファイルはディレクトリだが通常のファイルでも同じ。

ディレクトリ自体はドットファイルではないので、
非ドットファイルがいきなり表示されなくなる、
このような結果には問題がある。
この場合、ドットファイルがディレクトリ内に作成される前と同じく、

./bylaws/

のように、空ではないが空ディレクトリとして表示してもらいたい。

判別式 -empty はこのような判断には使えない。

$ find -name .?\* -prune -o \( -type f -print , -type d -exec sh -c '[ `ls -1 {} | wc -l` -eq 0 ]' \; -printf %p/\\n \) | sort
./articles.tex
./bylaws/
./fig-1-1.eps

うわっ、なっがーー。
とりあえず -empty の代わりに、
ls -1 | wc -l でファイル数をカウントし、
それが0の時に真になる -exec command ; アクションを使った。