새로운 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