"for file in"을 사용하여 여러 확장자를 선택한 다음 "file"의 기본 이름을 가져온 다음 확장자를 연결합니다.

"for file in"을 사용하여 여러 확장자를 선택한 다음 "file"의 기본 이름을 가져온 다음 확장자를 연결합니다.

for file in *.jpg;유닉스 기술을 연습하려고 노력 중입니다. 방금 작업 디렉토리의 모든 파일을 선택하는 방법을 배웠지만 .jpg여기서 멈추고 싶지 않습니다. bash 스크립트를 두 번 실행하고 싶지 않습니다.

시나리오는 다음과 같습니다 . 이 파일이 주어졌고 각 파일을 선택하고 확장자를 다른 파일로 바꾸고 싶습니다. 프로세스가 basename+ ".done" 과 같기를 원합니다.test1.jpgtest1.done

test1.jpg
test2.jpeg
test3.txt
test4.dummy

이제 내가 원하는 것은 어떻게든 이러한 확장을 .jpg,.jpeg,.txt,.dummy배열에 넣은 다음 for이를 이와 같은 루프에서 사용하는 것입니다 for file in *{.jpg,.jpeg,.txt,.dummy}; do. 그러나 시도해 보았지만 작동하지 않습니다. 쉘이 for 루프에서 이를 허용하지 않는 것 같습니다. 정렬?

누군가 나를 도와주고 이 문제를 해결하는 방법에 대한 예를 줄 수 있습니까? 감사해요!

고쳐 쓰다

그래서 나는 를 사용하면 for file in *.{jpg,jpeg,test}내 문제를 해결할 수 있다는 것을 배웠습니다. 그러나 때로는 실패합니다. 특히 확장명이 선언된 배열에 파일이 없는 경우에는 더욱 그렇습니다.

예:

test1.jpg
test2.jpeg
test3.test
test4.dummy

다음과 같이 bash를 사용하십시오.

for file in *.{jpg,jpeg,test,avi}; do size=$(stat -c '%s' "$file"); echo $file filesize is: $size; done

결국 추악해질 것입니다.

test1.jpg filesize is: 2
test2.jpeg filesize is: 0
test3.test filesize is: 0
stat: cannot stat `*.avi': No such file or directory
*.avi filesize is:

위의 마지막 두 줄은 불필요합니다. 이런 것이 있으면 좋겠고, 아무것도 찾지 못하면 break중지 하십시오.foravido

가능합니까?

답변1

다음을 사용하면 옵션을 bash설정할 수 있습니다 nullglob.

  nullglob
    If set, bash allows patterns which match no  files  (see
    Pathname  Expansion  above)  to expand to a null string,
    rather than themselves.

표시하려면:

$ ls
test1.dummy  test1.jpeg  test1.jpg  test1.test
$ shopt nullglob
nullglob        off
$ for file in *.{jpg,jpeg,test,avi}; do 
    echo "$file size is $(stat -c '%s' "$file")"; 
  done
test1.jpg size is 0
test1.jpeg size is 0
test1.test size is 0
stat: cannot stat ‘*.avi’: No such file or directory
*.avi size is 

활성화하면 nullglob:

$ shopt -s nullglob 
$ shopt nullglob ## just to demonstrate that it is on
nullglob        on
$ for file in *.{jpg,jpeg,test,avi}; do      
    echo "$file size is $(stat -c '%s' "$file")"
 done
test1.jpg size is 0
test1.jpeg size is 0
test1.test size is 0

또는 파일이 존재하는지 확인할 수 있습니다. (또한 여기서는 중괄호 확장이 필요하지 않음을 보여주기 위해 맨 위에 있는 이 예제를 사용했습니다.)

$ for file in *jpg *jpeg *test *avi; do
    [ -e "$file" ] &&  echo "$file size is $(stat -c '%s' "$file")" 
  done
test1.jpg size is 0
test1.jpeg size is 0
test1.test size is 0

관련 정보