情况:
我想将一个文件夹中所有大小大于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