您好stackoverflow社区, 我在删除文件名中包含空格的文件时遇到了问题,我拥有这部分代码,负责删除从目录中获取的文件,
for f in $(find $REP -type f -name "$Filtre" -mtime +${DelAvtPurge})
do
rm -f $f
我知道单引号或双引号可用于删除带空格的文件,当我在命令行中尝试使用它们时,它对我有用,但是当我将它们放在文件中的$ f中时,它根本不起作用。 有人可以帮我找到解决方案吗?
答案 0 :(得分:1)
GNU find为此拥有-delete
:
find "$REP" -type f -name "$Filtre" -mtime +"$DelAvtPurge" -delete
对于任何其他find
实现,您都可以使用bulk-exec:
find "$REP" -type f -name "$Filtre" -mtime +"$DelAvtPurge" -exec rm -f {} +
要进行试运行,请从第一个--delete
开始,然后查看要删除的文件列表;在echo
之前插入rm
。
答案 1 :(得分:0)
另一个答案显示了如何正确执行此操作。但是从根本上说,由于shell扩展变量的方式,命令中的问题是缺少引号:
rm -f $f
需要成为
rm -f "$f"
实际上,总是引用变量是安全的,通常是个好主意。
但是,这不会修复您的代码。现在,带空格的文件名可以使用,但带其他有效字符(例如,换行符)的文件名将不起作用。试试吧:
touch foo$'\n'bar
for f in $(find . -maxdepth 1 -name foo\*); do echo "rm -f $f"; done
输出:
rm -f ./foo
rm -f bar
显然那是行不通的。实际上,由于这个原因,您不必解析find
的输出。除了通过find -exec
解决方案之外,确保此安全的唯一方法是使用-print0
选项:
find "$REP" -type f -name "$Filtre" -mtime +"$DelAvtPurge" -print0 \
| IFS= while read -r -d '' f; do
rm -f "$f"
done
使用-print0
而不是(隐式)-print
会使find
用空字符而不是换行符来分隔匹配。相应地,IFS= read -r -d ''
读取以空字符分隔的输入字符串,我们使用while
在循环中执行此操作(-r
选项可防止read
将反斜杠解释为转义序列)。