두 개 이상의 파일이 포함된 디렉터리

두 개 이상의 파일이 포함된 디렉터리

2개 이상의 일반 파일이 포함된 현재 디렉터리(즉, 하위 디렉터리)의 하위 디렉터리를 찾고 싶습니다.

나는 2개 미만의 파일을 포함하는 디렉터리나 하위 디렉터리만 포함하는 디렉터리에는 관심이 없습니다.

답변1

이것은 쉘 명령 실행(발견된 각 디렉토리에 대한 파일 수 계산)을 기반으로 한 답변보다 훨씬 빠르고 CPU 친화적인 findGNU 기반 답변입니다 .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개 이상의 일반 파일이 포함된 하위 폴더 이름/경로 인쇄

관련 정보