programing

특정 확장자를 가진 모든 파일을 루프합니다.

cafebook 2023. 4. 19. 00:22
반응형

특정 확장자를 가진 모든 파일을 루프합니다.

for i in $(ls);do
    if [ $i = '*.java' ];then
        echo "I do something with the file $i"
    fi
done

현재 폴더의 각 파일을 루프하여 특정 확장자와 일치하는지 확인합니다.위의 코드가 작동하지 않는데, 왜 그런지 아세요?

화려한 트릭은 필요 없습니다.

for i in *.java; do
    [ -f "$i" ] || break
    ...
done

하는 파일이 루프는 파일명을 않고 됩니다.*.java.

»bash 이와 유사한 하는 셸), (또는 셸), 를할 수 .nullglob루프의 본문을 입력하지 않고 단순히 실패한 일치를 무시합니다.

shopt -s nullglob
for i in *.java; do
    ...
done

은, 을 참조해 주세요.breakcontinue댓글로 토의하겠습니다.이 기능을 사용할지 여부는 다소 범위 밖이라고 생각합니다.break ★★★★★★★★★★★★★★★★★」continue은 두 경우를 즉, 두 가지 경우입니다.

  1. *.java일치하는 항목이 없기 때문에 문자 그대로의 텍스트로 취급됩니다.
  2. *.java에는 적어도1개의 일치가 , 그에 「1」이라고 하는 되어 있을 이 있습니다.*.java.

#,break is is is 、 of of 、 of of 、 is of 、 is of of of of of is is is is is is 。$i 곧 forth forth forth forth forth forth forthbreak ★★★★★★★★★★★★★★★★★」continue (비록)은) 이다.break즉, 루프가 수동적으로 종료되기를 기다리는 것이 아니라 루프를 종료하는 것입니다).

#2의 경우 가능한 모든 일치에 대해 필요한 모든 필터링을 수행해야 합니다.그그음음, 음음음음음 of of of of of 의 선택은break ★★★★★★★★★★★★★★★★★」continue어느 테스트보다 관련성이 낮다(-f,-d,-e, 에 $i, IMO는 를 "하는 잘못된 방법은 IMO입니다.

저는 ,, 는, 는, 는, 저, 저, 저, the, the, the, that, that, that, that, that, that, that, that, that, that, that, that, that, that, that, the, the, the, the, the, the, ,$i #1의 경우, #2의 경우, 처리할 파일을 선택하는 논리가 아니라 각 파일의 비즈니스 로직과 더 관련이 있습니다.질문에서 어느 한쪽의 선택을 표현하기보다는 각각의 사용자에게 그 논리를 맡기고 싶습니다.


로로 as aszsh지구본 자체에서 이러한 필터링을 수행하는 방법을 제공합니다.로 끝나는 일반 파일만 일치시킬 수 있습니다..java하지 않는 합니다).

for f in *.java(.N); do
  ...
done

상기에서는 루프 본체에 도달했을 경우$f는 일반 파일 이름으로 확장됩니다.. 만들다*.java시키고 """는 ""를 참조해 주세요.N에러를 생성하는 대신 실패한 일치가 0으로 확장됩니다.

파일 이름 확장에서 모든 종류의 필터링을 수행하기 위한 다른 글로벌 수식자도 있습니다.(장난입니다)zsh으로 인해 ""를 사용할 find 그렇지 않아요

하위 폴더를 재귀적으로 추가합니다.

for i in `find . -name "*.java" -type f`; do
    echo "$i"
done

같이 모든 ..img,.bin,.txt파일명을 인쇄합니다.

for i in *.img *.bin *.txt;
do
  echo "$i"
done

또는 재귀적인 방법으로(모든 서브디렉토리에서도 찾을 수 있습니다):

for i in `find . -type f -name "*.img" -o -name "*.bin" -o -name "*.txt"`;
do
  echo "$i"
done

정답은 @chepner의 것입니다.

EXT=java
for i in *.${EXT}; do
    ...
done

다만, 파일명에 특정의 확장자가 붙어 있는지를 체크하기 위한 간단한 트릭을 다음에 나타냅니다.

EXT=java
for i in *; do
    if [ "${i}" != "${i%.${EXT}}" ];then
        echo "I do something with the file $i"
    fi
done

@chepner가 코멘트에서 말한 것처럼 $i를 고정 문자열과 비교하고 있습니다.

이 상황을 확장하고 수정하려면 regex 연산자 = ~와 함께 [[ ]를 사용해야 합니다.

예:

for i in $(ls);do
    if [[ $i =~ .*\.java$ ]];then
        echo "I want to do something with the file $i"
    fi
done

=~의 오른쪽에 있는 regex는 왼쪽 연산자의 값에 대해 테스트되므로 따옴표로 묶으면 안 됩니다. (따옴표로 묶은 것은 오류는 발생하지 않지만 고정 문자열과 비교되므로 실패할 가능성이 높습니다.)

그러나 위의 @chepner의 답변은 glob을 사용하는 것이 훨씬 효율적인 메커니즘입니다.

파일을 루프하는 올바른 방법에 대한 다른 답변에 동의합니다.그러나 OP는 다음과 같이 질문했습니다.

위의 코드가 작동하지 않는데, 왜 그런지 아세요?

네!

훌륭한 기사 "테스트와 [?]의 차이는 무엇입니까?"는 다른 차이점 중 사용할 수 없는 것을 자세히 설명합니다.expression matching ★★★★★★★★★★★★★★★★★」pattern matching의 범위 내에서test)[)


새로운 테스트 [[ old test ]]의 기능 [예]
패턴 일치 = (또는 ==)(사용할 수 없음) [[ $name = a* ] | echo "name이 'a'로 시작되지 않음: $name"
정규 표현식 =~ (사용할 수 없음) [[ $(날짜) =~ ^금\...13일의 금요일입니다."매칭

이것이 스크립트가 실패하는 이유입니다.가 이 있는 [[synthax(synthax)에서 지원되지 ).[command.command

편집: 답변의 데이터를 표 형식으로 포맷하는 방법에 대한 힌트가 있으면 도움이 됩니다.

나는 이 해결책이 꽤 유용하다는 것을 알았다., 이렇게 요.-or입니다.find:

find . -name \*.tex -or -name "*.png" -or -name "*.pdf"

확장자를 가진 파일을 찾습니다.tex,png , , , , 입니다.pdf.

언급URL : https://stackoverflow.com/questions/14505047/loop-through-all-the-files-with-a-specific-extension

반응형