bash 쉘 : .png 또는 .PNG 유형의 모든 파일을 나열 하시겠습니까?


14

bash 스크립트에서 '.png 또는 .PNG 유형의 모든 파일에 대해 어떻게 말할 수 있습니까?

노력하고있어 :

for i in (`ls *.PNG` && `ls *.png`)

구문 오류가 발생했습니다.

답변:


18

가능한 모든 조합을 원하면 다음을 사용하십시오.

for i in *.[Pp][Nn][Gg]; do

또는

shopt -s nocaseglob
for i in *.png; do

이 스크립트를 실행하기 전까지는 모든 스크립트 쉘 글로브 (예 : 와일드 카드 파일 일치)를 대소 문자를 구분하지 않습니다 shopt -u nocaseglob.

.PNG 및 .png 만 원한다면 (예 : .PnG 또는 .pnG는 아님) 다음 중 하나를 사용하십시오.

shopt -s nullglob
for i in *.png *.PNG; do

또는

for i in *.png *.PNG; do
    [[ -e "$i" ]] || continue

nullglob 또는 존재 검사의 이유는 소문자 또는 대문자 확장자 만있는 경우 파일 목록에 일치하지 않는 패턴이 포함되어 루프 본문에 오류가 발생하기 때문입니다. nocaseglob와 마찬가지로 나중에 nullglob 셸 옵션을 끄고 싶을 수도 있습니다 (Nullglob을 사용한 경험이 종종 스크립트에서 특히 좋지만). 실제로, 나는 일치하는 것이없는 경우를 대비하여 모든 파일 일치에 대해 nocaseglob 또는 존재 확인을 사용하는 것이 좋습니다.


5
for i in *.{png,PNG}
glenn jackman

@glenn : 여전히 nullglob 또는 존재 확인이 필요하지만 작동합니다 (`* .png * .PNG와 동일).
Gordon Davisson

5

당신은 또한 같은 하나의 라이너를 시도 할 수 있습니다

찾기 . -iname "* .png"-exec ....

또는

찾기 . -iname "* .png"| xargs ....

편집
재귀에 대한 아래의 @Yab 의견도 참조하십시오.


1
find는 기본적으로 재귀 적이므로, 질문과 동일한 결과를 얻으려면 다음을 수행해야합니다. find -maxdepth 1 -iname "*.png"
Yab

@ 야브, 당신은 완벽하게 정확합니다. 나는이 측면을 간과했다.
Alain Pannetier

1

ls 여기에 거의 쓸모가 없지만 여기에 대한 기록은 시도에 더 가까운 구문입니다.

for i in $(ls *.PNG ; ls *.png)

노트:

  • 대문자와 소문자 그림을 모두 원한다고 가정합니다. && 구분 기호는 PNG 파일이 존재하는 경우에만 png 파일을 처리한다는 것을 의미합니다.
  • 두 패턴 중 어느 파일도 발견되지 않으면 오류 메시지가 표시됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.