경로가 가장 긴 디렉토리를 찾는 방법은 무엇입니까?

경로가 가장 긴 디렉토리를 찾는 방법은 무엇입니까?

ls ~ -R명령을 사용하여 현재 디렉터리에서 가장 긴 경로(가장 많은 하위 디렉터리 포함)가 있는 디렉터리를 찾는 방법

답변1

GNU는 술어의 형식 지정자를 사용하여 find찾은 이름의 깊이를 출력 할 수 있습니다.%d-printf

find . -type d -printf '%d\t%p\n'

이는 현재 디렉토리 또는 그 아래에서 발견된 디렉토리의 깊이와 .검색 경로에 상대적인 디렉토리 경로 이름을 출력합니다. 깊이와 경로 이름은 단일 탭으로 구분됩니다.

\0이 정보를 정렬 등을 위해 다른 도구에 올바르게 전달하기 위해 경로 이름에 개행 문자가 포함될 수 있다고 가정합니다. 형식 문자열의 끝 대신 사용하는 것이 \n더 안전합니다 . 그런 다음 GNU를 사용하여 결과 Null 종료 목록을 정렬하고 sortGNU 및 GNU를 사용하여 가장 깊은 경로 이름을 선택할 수 있습니다. 이러한 도구의 GNU 변형은 모두 비표준 옵션을 전달하는 경우 null로 끝나는 레코드를 처리할 수 있으며 표준 도구는 모두 텍스트 줄을 처리할 수 있습니다.tailcut-z

find . -type d -printf '%d\t%p\0' | sort -z -n | tail -z -n 1 | cut -z -f 2-

Final은 cut문자열의 시작 부분부터 숫자 깊이를 제거합니다.

그러면 현재 디렉토리 아래에서 가장 긴(가장 깊은) 디렉토리 경로 이름을 포함하는 표준 출력에 널 종료 문자열이 제공됩니다. 동일한 깊이의 경로 이름이 여러 개 있는 경우 마지막 경로를 기준으로 사전순으로 정렬된 경로 이름이 제공됩니다.

답변2

다음에서는 디렉터리 이름에 개행 문자가 포함되어 있지 않다고 가정합니다. 이 경우 다음이 작동합니다.

find . -type d | awk -F'/' 'NF>max{longest=$0;max=NF} END{if (max) print longest}'

find현재 디렉토리의 모든 하위 디렉토리를 검색 합니다 . 최대 필드 수(=경로 구성 요소)가 있는 입력 문자열을 식별하기 위해 awk필드 구분 기호를 로 설정하여 출력을 에 제공합니다 . /입력 문자열(있는 경우)이 끝에 인쇄됩니다.

답변3

물론 구문 분석된 출력은 일반적으로 바람직하지 않지만 다음과 같은 방법 ls으로 이 작업을 수행하려는 경우ls -R

ls -R ~ | grep '/' | while read var ; do
        res="${var//[^/]}"
        echo "${#res} $var"
done | sort -n | sed 's/^[^ ]* //' | tail -1

작동해야합니다.

참고: 이는 결코 완벽한 방법이 아닙니다. 복잡한 디렉토리 이름(예: /이름에 줄 바꿈 또는 a 포함)이 있는 경우 이 스크립트는 크게 실패합니다.

관련 정보