2개 이상의 일반 파일이 포함된 현재 디렉터리(즉, 하위 디렉터리)의 하위 디렉터리를 찾고 싶습니다.
나는 2개 미만의 파일을 포함하는 디렉터리나 하위 디렉터리만 포함하는 디렉터리에는 관심이 없습니다.
답변1
이것은 쉘 명령 실행(발견된 각 디렉토리에 대한 파일 수 계산)을 기반으로 한 답변보다 훨씬 빠르고 CPU 친화적인 find
GNU 기반 답변입니다 .uniq
find . -type f -printf '%h\n' | sort | uniq -d
이 find
명령은 계층 구조에 있는 모든 파일의 디렉터리를 인쇄하고 uniq
적어도 두 번 나타나는 디렉터리만 표시합니다.
답변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개 이상의 일반 파일이 포함된 하위 폴더 이름/경로 인쇄