모든 파일 디렉터리를 반복하고 길이가 5보다 큰 파일을 가져옵니다.

모든 파일 디렉터리를 반복하고 길이가 5보다 큰 파일을 가져옵니다.

새로운 Linux 사용자는 여기를 살펴보십시오. 모든 디렉토리 폴더를 통과하여 이름을 에코하고 이름의 전체 길이를 추출한 후 에코를 화장실 타워에 저장하여 컨트롤에 에코하는 루프를 만들고 있습니다.

총 길이가 5보다 작으면 인쇄되고 그렇지 않으면 통과하도록 다른 조건을 추가하려면 어떻게 해야 합니까?

나는 다음을 시도했습니다 :

for i in *                 
    do
        if [ -d "$i" ]
            then
           if (echo n "$i" | wc -m < 5)
                then
                    wc
               fi
        fi
    done

다음을 인쇄하세요:

zsh: no such file or directory: 5
zsh: no such file or directory: 5
zsh: no such file or directory: 5
zsh: no such file or directory: 5
...
...

주어진 조건에서 하위 디렉터리 파일에 액세스할 수 있도록 상위 디렉터리 내의 파일을 어떻게 가져올 수 있습니까?

for i in *
    do
        if [ -d "$i" ]
             if (( $( echo n "$i" | wc -m ) == 76 ))
             then
             find $i
        fi 
    done

상위 디렉토리의 파일 인쇄

답변1

모든 디렉토리에서 이름이 5자를 초과하지 않는 디렉토리를 검색하려면 명령을 사용하여 수행할 수 있습니다 find. 명시적인 루프가 필요하지 않습니다.

find -type d \( -name '??????*' -o -print \)

설명하다

  • -type d- 디렉토리 항목만 고려됩니다.
  • \( ... \)- 이것들을 하나로 묶으세요
  • item1 -o item2- item실패하면 실행item2
  • -name '??????*'- 6자 이상의 이름과 일치합니다.
  • -print- 현재 프로젝트 이름을 인쇄합니다.

요약하자면, 먼저 디렉터리만 일치시킵니다. 다음 부분은 6자 이상의 항목(디렉터리)과 일치하고 일치에 실패하면 항목(디렉터리) 이름을 인쇄합니다.

답변2

이 시도:

for i in *
  do
    if [ ${#i} -gt 5 ]; then
        echo $i: ${#i};
    fi;
  done

답변3

참고: 제목에 "길이가 다음보다 큼"이 언급되어 있지만 코드 예제에서는 보다 작음 기호를 사용합니다 <. 나는 여기서 후자를 가정하고 있습니다. 전자를 원한다면 다음 -lt으로 변경하십시오.-gt

zsh를 사용하고 있으므로 다음을 사용하여 더 직접적으로 이 작업을 수행할 수 있습니다.글로벌 예선, 명시적인 루프가 전혀 필요하지 않습니다.

  • 한정자는 /결과를 디렉터리로만 제한합니다.

  • (nullglob) 한정자는 N일치하는 파일이 없는 경우 오류를 억제하는 데 사용됩니다.

  • (선택 사항) D숨겨진 디렉터리를 포함하려면 한정자를 추가하세요.

  • e:cmd:cmd한정자가 true를 반환하는 파일 만 반환

cmd변수를 통해 일치하는 각 파일 이름에 적용되는 쉘 표현식은 어디에 있습니까 REPLY? 귀하의 경우 확장 테스트 표현식을 사용하여 [[ $#REPLY -lt 5 ]]외부 명령 없이 결과 길이를 테스트할 수 있습니다. 그래서#wc

print -rC1 *(/Ne:'[ $#REPLY -lt 5 ]':)

하위 디렉터리를 통해 재귀적으로 만들려면 **/*"globstar" 모드를 사용하고 REPLY길이 비교를 수행하기 전에 변수에서 선행 경로 구성 요소를 제거합니다.

print -rC1 **/*(/Ne:'[ ${#REPLY##*/} -lt 5 ]':)

man zshexpn자세히보다.

답변4

@tink는 제가 해결책을 찾는 데 도움이 되도록 올바른 코드를 제공하는 훌륭한 일을 해냈습니다.

이 스크립트의 작동 방식:

for i in *
    do
        if [ -d "$i" ]
             if (( $( echo n "$i" | wc -m ) > 75 ))
             then
             echo "$i" 
        fi 
    done

관련 정보