for file in *.jpg;
유닉스 기술을 연습하려고 노력 중입니다. 방금 작업 디렉토리의 모든 파일을 선택하는 방법을 배웠지만 .jpg
여기서 멈추고 싶지 않습니다. bash 스크립트를 두 번 실행하고 싶지 않습니다.
시나리오는 다음과 같습니다 . 이 파일이 주어졌고 각 파일을 선택하고 확장자를 다른 파일로 바꾸고 싶습니다. 프로세스가 basename
+ ".done" 과 같기를 원합니다.test1.jpg
test1.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
중지 하십시오.for
avi
do
가능합니까?
답변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