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

関連情報