2つ以上の一般的なファイルを含む現在のディレクトリ(つまり、サブディレクトリ)のサブディレクトリを探したいと思います。
2つ未満のファイルを含むディレクトリやサブディレクトリのみを含むディレクトリには興味がありません。
答え1
これは、シェルコマンドの実行(見つかった各ディレクトリのファイル数の計算)に基づく回答よりもはるかに高速でCPUに優しいfind
GNUベースの回答です。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つ以上の一般ファイルを含むサブフォルダ名/パスを印刷する