![for 루프 문제, 파일 크기를 감지하고 이름에 관계없이 복사](https://linux55.com/image/85937/for%20%EB%A3%A8%ED%94%84%20%EB%AC%B8%EC%A0%9C%2C%20%ED%8C%8C%EC%9D%BC%20%ED%81%AC%EA%B8%B0%EB%A5%BC%20%EA%B0%90%EC%A7%80%ED%95%98%EA%B3%A0%20%EC%9D%B4%EB%A6%84%EC%97%90%20%EA%B4%80%EA%B3%84%EC%97%86%EC%9D%B4%20%EB%B3%B5%EC%82%AC.png)
상황:
한 폴더에서 크기가 0보다 큰 모든 odt 파일을 다른 폴더로 복사하고 싶습니다. 파일 이름에는 다음 문자가 포함됩니다: + % & [ ( 및 공백.
내 시도는 다음과 같습니다.
#!/bin/bash
mvfunc ()
{
if [ -s "$1" ]; then
cp -n "$1" /home/telas/zztmp/currentfiles/
/usr/bin/truncate -s 0 "$1"
return 0
fi
}
fileslist=$(ls --quoting-style=shell-always /home/telas/zzz/workingfiles/*.odt)
for filename in "$fileslist" ; do
mvfunc "$filename"
done
모든 도움에 크게 감사드립니다!
답변1
경로 이름 확장(와일드카드)와 같은 외부 명령에 의존하는 것보다 Bash에서 ls
.
for
루프에 와일드카드가 포함된 경우 Bash는 기본적으로 와일드카드를 사용하므로 특수 문자는 주어진 인수를 명령 대체로 해석하여 생성된 텍스트 문자열로 복잡해지지 않습니다.
--quoting-style=
그리고 옵션이 GNU ls에만 적용되므로 코드가 더 깔끔하고 이식성이 뛰어납니다 .
#!/bin/bash
mvfunc ()
{
if [ -s "$1" ]; then
cp -n "$1" currentfiles
/usr/bin/truncate -s 0 "$1"
return 0
fi
}
for filename in /home/telas/zzz/workingfiles/*.odt; do
mvfunc "$filename"
done