4

私は私の質問に対する解決策を持っています

find . -type d -exec sh -c 'test $(find "$0" -maxdepth 1 -type d | wc -l) -eq 1' {} \; -print

これを行うためのより良い(より速い)方法があるかどうか疑問に思います。別の検索プロセスを「検索」するのはあまり好きではありません。

4

2 に答える 2

4

man findオプションをリストします:

   -links n
          File has n links.

.2 つのリンク (つまり、およびその名前)のみを含むディレクトリを探しています。以下は、サブディレクトリのないディレクトリを返します。

find . -type d -links 2

通常の Unix ファイルシステムの各ディレクトリには、少なくとも 2 つのハード リンクがあります: その名前とその . (親ディレクトリ) エントリです。さらに、そのサブディレクトリ (存在する場合) には、それぞれそのディレクトリに.. リンクされたエントリがあります。

于 2013-07-25T12:25:13.507 に答える
1

もう少しコーディングすると、次のコマンドも機能するはずです。

find . -type d|awk 'NR>1{a[c++]=$0; t=t $0 SUBSEP} END{for (i in a) {if (index(t, a[i] "/") > 0) delete a[i]} for (i in a) print a[i]}'

読みやすくする:

find . -type d | awk 'NR > 1 {
   a[c++]=$0;
   t=t $0 SUBSEP
}
END {
   for (i in a) {
      if (index(t, a[i] "/") > 0)
         delete a[i]}
   for (i in a)
      print a[i]
}'

このソリューションではより多くのコーディングのように見えるかもしれませんが、大きなディレクトリでは、この awk ベースのコマンドはfind | wc、質問のように組み込みソリューションよりもはるかに高速に実行されるはずです。

性能試験:

15k 以上のネストされたサブディレクトリを含むディレクトリで実行したところ、この awk コマンドは OP のfind | wcコマンドよりもかなり高速 (250 ~ 300% 高速) であることがわかりました。

于 2013-07-25T14:55:27.670 に答える