複数のファイルを含むディレクトリ

複数のファイルを含むディレクトリ

2つ以上の一般的なファイルを含む現在のディレクトリ(つまり、サブディレクトリ)のサブディレクトリを探したいと思います。

2つ未満のファイルを含むディレクトリやサブディレクトリのみを含むディレクトリには興味がありません。

答え1

これは、シェルコマンドの実行(見つかった各ディレクトリのファイル数の計算)に基づく回答よりもはるかに高速でCPUに優しいfindGNUベースの回答です。uniq

find . -type f -printf '%h\n' | sort | uniq -d

このfindコマンドは、階層内のすべてのファイルのディレクトリを印刷し、uniq少なくとも2回表示されるディレクトリのみを表示します。

答え2

の助けを借りてザイルズの答え存在するその逆と若干の修正が必要な全てです。

find . -type d -exec sh -c 'set -- "$1"/*;X=0; 
    for args; do [ -f "$args" ] && X=$((X+1)) ;done; [ "$X" -gt 1 ] ' _ {} \; -print

ディレクトリツリー。

.
├── test
│   ├── dir1
│   │   ├── a
│   │   ├── b
│   │   └── c
│   ├── dir2
│   │   ├── dira
│   │   │   └── a file\012with\012multiple\012line
│   │   ├── dirb
│   │   │   ├── file-1
│   │   │   └── file-2
│   │   └── dirc
│   ├── diraa
│   ├── dirbb
│   ├── dircc
│   └── x
│   └── x1
│   └── x2
└── test2
    ├── dir3
    └── dir4

結果:

./test
./test/dir1
./test/dir2/dirb

答え3

find . -type d \
    -exec sh -c 'c=0; for n in "$1"/*; do [ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 )); done; [ "$c" -ge 2 ]' sh {} ';' \
    -print

その後、現在のディレクトリ内または下のすべての名前を見つけて、ディレクトリ名ではなく名前をフィルタリングします。

残りのディレクトリ名はこの短いスクリプトで提供されます。

c=0
for n in "$1"/*; do
    [ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 ))
done

[ "$c" -ge 2 ]

このスクリプトは、最初のコマンドライン引数(from)で指定されたディレクトリにある一般ファイル(シンボルリンクをスキップ)の数を数えますfind。スクリプトの最後のコマンドは、数が2以上であることをテストします。このテストの結果はスクリプトの戻り値(終了状態)です。

テストが成功すると、ディレクトリパスが印刷さ-printれます。find

隠しファイル(名前がドットで始まるファイル)も考慮するには、sh -cスクリプトを次から次に変更します。

for n in "$1"/*; do

到着

for n in "$1"/* "$1"/.*; do

テスト:

$ tree
.
`-- test
    |-- a
    |-- dir1
    |   |-- a
    |   |-- b
    |   `-- c
    `-- dir2
        |-- dira
        |-- dirb
        |   |-- file-1
        |   `-- file-2
        `-- dirc

6 directories, 6 files

$ find . -type d -exec sh -c 'c=0; for n in "$1"/*; do [ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 )); done; [ "$c" -ge 2 ]' sh {} ';' -print
./test/dir1
./test/dir2/dirb

答え4

その他find+wc方法:

find path/currdir -maxdepth 1 -type d ! -empty ! -path "path/currdir" \
-exec sh -c 'count=$(find "$1" -maxdepth 1 -type f | wc -l); [ $count -ge 2 ]' _ {} \; -print

  • path/currdir- 現在のディレクトリのパス

  • -maxdepth 1- 考慮してください直接サブサブフォルダ

  • ! -empty- 空のサブフォルダを無視

  • ! -path "path/currdir"- 現在のディレクトリパスを無視します。

  • count=$(find "$1" -maxdepth 1 -type f | wc -l)count- 見つかった各サブフォルダにファイル数を割り当てる

  • [ $count -ge 2 ] ... -print- 2つ以上の一般ファイルを含むサブフォルダ名/パスを印刷する

関連情報