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

相关内容