2012-04-30 2 views
1

주어진 디렉토리에 31 문자를 초과하는 디렉토리 이름이 있는지 (즉, 해당 루트 아래를보아야하는지) 확인해야합니다.디렉토리 이름의 길이를 재귀 적으로 확인하십시오.

은 내가 나에게 완전한 경로의 텍스트 파일을 줄 것이다 find /path/to/root/dir -type d >> dirnames.txt

이 같은 것을 사용할 수 있습니다 알고 있습니다.

필요한 것은 각 디렉토리 이름의 실제 문자 수를 얻는 것입니다. 위의 결과를 구문 분석하는 것이 sed인지 awk인지 이해할 수 없습니다. 이것을 달성하는 방법에 대한 아이디어/생각/제안/팁을 찾으십시오. 감사!

+1

디렉토리 이름 만 또는 전체 경로 길이를 원하십니까? – Sorpigal

답변

0

당신의 find cmd를 만든 당신의 dirnames.txt 파일을 사용하여 다음 예

awk '{print length($0) "\t" $0}' dirnames.txt | sort +0nr -1 > dirNamesWithSize.txt 

이 (길이의 값을 기준으로) 가장 긴 경로 이름을 선물 할 것이다, 경로 이름의 길이하여 데이터를 정렬 할 수 있습니다 파일의 맨 위에.

이 정보가 도움이되기를 바랍니다.

2

이 짧은 스크립트가 한 번에 모든 작업을 수행, 즉 모든 디렉토리의 이름을 발견하고 길이보다 큰 31 개 문자 (문자 그 길이와 함께)있는 모든 출력 :

for d in `find /path/to/root/dir -type d -exec basename {} \;` ; do 
    len=$(echo $d | wc -c) 
    if [ $len -gt 31 ] ; then 
    echo "$d = $len characters" 
    fi 
done 
+1

대단히 고마워,이 트릭을 한거야! –

0

시도를
find . -type d -exec bash -c '[ $(wc -c <<<"${1##*/}") -gt 32 ] && echo "${1}"' -- {} \; 2>/dev/null 

내가 생각하는 한 가지 버그는 매번 디렉토리 이름 길이를 1 씩 초과 할 것입니다. 무엇을 당신이 원하는 것은 전체 경로가 아닌 마지막 경로 구성 요소가 있었다면

,이를 사용

find . -type d | sed -e '/.\{32,\}/!d' 

이 버전은 버그를 가지고 있지만, 파일 이름은 줄 바꿈을 삽입 한 경우에만 사용할 수 있습니다.

두 명령의 출력은 조건과 일치하는 파일 이름 목록입니다. 각자의 길이를 세는 것은 거기에서 사소하다.

관련 문제