for 루프 문제, 파일 크기를 감지하고 이름에 관계없이 복사

for 루프 문제, 파일 크기를 감지하고 이름에 관계없이 복사

상황:
한 폴더에서 크기가 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

관련 정보