ls ~ -R
명령을 사용하여 현재 디렉터리에서 가장 긴 경로(가장 많은 하위 디렉터리 포함)가 있는 디렉터리를 찾는 방법
답변1
GNU는 술어의 형식 지정자를 사용하여 find
찾은 이름의 깊이를 출력 할 수 있습니다.%d
-printf
find . -type d -printf '%d\t%p\n'
이는 현재 디렉토리 또는 그 아래에서 발견된 디렉토리의 깊이와 .
검색 경로에 상대적인 디렉토리 경로 이름을 출력합니다. 깊이와 경로 이름은 단일 탭으로 구분됩니다.
\0
이 정보를 정렬 등을 위해 다른 도구에 올바르게 전달하기 위해 경로 이름에 개행 문자가 포함될 수 있다고 가정합니다. 형식 문자열의 끝 대신 사용하는 것이 \n
더 안전합니다 . 그런 다음 GNU를 사용하여 결과 Null 종료 목록을 정렬하고 sort
GNU 및 GNU를 사용하여 가장 깊은 경로 이름을 선택할 수 있습니다. 이러한 도구의 GNU 변형은 모두 비표준 옵션을 전달하는 경우 null로 끝나는 레코드를 처리할 수 있으며 표준 도구는 모두 텍스트 줄을 처리할 수 있습니다.tail
cut
-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 포함)이 있는 경우 이 스크립트는 크게 실패합니다.