디렉토리 계층 구조가 있습니다. 일부 디렉터리에는 파일이 없고 다른 디렉터리만 포함되어 있습니다. 일부는 파일을 포함합니다.
예를 들어:
- 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
일부 출력이 생성됩니다(즉, 후보 디렉터리에서 일부 일반 파일을 찾습니다).