하나 이상의 파일이 포함된 모든 디렉토리를 찾는 방법은 무엇입니까?

하나 이상의 파일이 포함된 모든 디렉토리를 찾는 방법은 무엇입니까?

디렉토리 계층 구조가 있습니다. 일부 디렉터리에는 파일이 없고 다른 디렉터리만 포함되어 있습니다. 일부는 파일을 포함합니다.

예를 들어:

- movies
  - 2022
    - action
      - movie.mp4
      - another-movie.mp4
  - 2023
    - drama
      - movie2.mp4
  - 2024
    - thriller
      - movie3.mp4
    - movie4.mp4

find나는 이 결과를 제공하는 명령을 원합니다 :

/movies/2022/action
/movies/2023/drama
/movies/2024
/movies/2024/thriller

나는 읽었다이것그리고이것그리고이것find, 하지만 명령을 알아낼 수 없습니다 .

고쳐 쓰다: 디렉터리에는 파일과 디렉터리가 포함될 수 있습니다. 질문을 업데이트했습니다. 예를 들어, 2024영화와 다른 디렉토리가 있습니다. 결과에는 목차가 /movies/2024포함 되어야 합니다./movies/2024/thriller

답변1

파일 형식 찾기정기적인포함된 디렉토리를 인쇄합니다. 목록은 각 디렉터리가 한 번만 나열되도록 고유합니다. GNU 시스템에서는 개행 문자가 포함된 파일 경로가 있더라도 안정적으로 이 작업을 수행할 수 있습니다.

find /path -type f -print0 |
    LC_ALL=C sed -z 's!/[^/]*$!!' |
    LC_ALL=C sort -zu |
    tr '\0' '\n'

표준에서는 파일 경로에 개행 문자가 포함되어 있지 않다고 가정합니다.

find /path -type f -print |
    LC_ALL=C sed 's!/[^/]*$!!' |
    LC_ALL=C sort -u

답변2

간단히,

find movies -type f -print | \
    xargs -r dirname | \
    sort --uniq

읽다 man find xargs dirname sort.

설명은 다음과 같습니다.

  • find모든 파일과 해당 디렉토리의 목록을 출력 /movies/2022/action/movie.mp4 /movies/2022/action/another-movie.mp4 ...합니다 STDOUT.
  • xargs가능한 한 많은 파일 이름을 압축하고(참고자료 참조 xargs --show-limits </dev/null) 파일 이름이 부족할 dirname때까지 반복합니다.xargs
  • dirname가장 오른쪽 /과 파일 이름을 잘라냅니다. 예를 들어, /movies/2022/action/movie.mp4되기 /movies/2022/action/movies/2022/action/another-movie.mp4또한 되기/movies/2022/action/
  • sort --unique중복된 디렉터리 이름을 제거합니다.

이 구조( find, xargs, 사후 처리)는 많은 작업에 유용합니다. 그것을 이해하기 위해 약간의 노력을 기울이십시오.

답변3

이렇게 하면 트릭을 수행할 수 있습니다.

find /movies -type d -not -empty -links 2

견적으로 이동이 답변:

링크 수는 파일에 대한 하드 링크 수입니다. 디렉토리의 경우 하드 링크 수는 (직접) 하위 디렉토리 수에 상위 디렉토리와 자체를 더한 수입니다.

따라서 링크 수가 2개인 경우 상위 디렉터리( ..)와 자체 디렉터리( .)만 있으므로 하위 디렉터리는 없습니다.


이 답변은 원래 질문에는 효과가 있었지만 나중에 업데이트된 질문에는 더 이상 작동하지 않습니다. 다른 사람에게 도움이 될 수도 있으므로 남겨 두겠습니다.

답변4

면책조항: 저는 현재 rawhide(rh)의 저자입니다(github.com/raforg/rawhide 참조).

생가죽(rh)을 사용하면 다음을 수행할 수 있습니다.

rh /movies 'd && !empty && "[ -n \"$(rh -ref -- %S)\" ]".sh'

/movies검색 경로입니다.

남은 것은 검색 기준뿐입니다.

d디렉토리라는 뜻입니다.

!empty비어 있지 않다는 뜻이다. 이는 필수는 아니지만 다음에 생성되는 셸 프로세스 수를 줄여 작업 속도를 높일 수 있습니다.

"[ -n \"$(rh -ref -- %S)\" ]".sh쉘 명령을 실행하여 [ -n "$(rh -ref -- %S)" ]후보 디렉토리에 일반 파일이 있는지 확인하십시오(nested use rh).

rh -ref -- %S응 줄임말 rh -r -e f -- %S.

-r찾기와 마찬가지로 -mindepth 1 -maxdepth 1한 수준 아래로만 검색할 수 있습니다.

일반 파일과 일치하는 검색 기준 표현식을 지정합니다 -e f.f

악성 파일 이름이 (예: ) 옵션 --으로 해석되는 것을 방지하기 위해 명령줄 옵션 구문 분석을 중지합니다 (Stéphane에게 감사드립니다).rh-xreboot

%S중첩이 검색해야 하는 현재 후보 디렉터리의 이름 입니다 .rh

[ -n ... ]중첩된 명령을 테스트하면 rh일부 출력이 생성됩니다(즉, 후보 디렉터리에서 일부 일반 파일을 찾습니다).

관련 정보