你好,stackoverflow社区,我面临着删除文件名中包含空格的文件的问题,我有这部分代码负责删除我们从目录中获得的文件
for f in $(find $REP -type f -name "$Filtre" -mtime +${DelAvtPurge})
do
rm -f $f
我知道单引号或双引号适用于删除带有空格的文件,当我在命令行中尝试它们时,它对我有效,但当我将它们放在文件中的$f中时,它根本不起作用。有人能帮我找到解决办法吗?
GNU find有-delete
:
find "$REP" -type f -name "$Filtre" -mtime +"$DelAvtPurge" -delete
对于任何其他find
实现,您可以使用批量执行:
find "$REP" -type f -name "$Filtre" -mtime +"$DelAvtPurge" -exec rm -f {} +
对于试运行,从第一个文件中删除-delete
,然后查看要删除的文件列表;例如,在rm
之前插入echo
。
另一个答案已经展示了如何正确地做到这一点。但从根本上讲,由于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
通过null字符而不是换行符来分隔命中。相应地,IFS= read -r -d ''
读取一个空字符分隔的输入字符串,这是我们在循环中使用while
执行的(-r
选项防止read
将反斜杠解释为转义序列(。