正在删除文件名中有空格/没有空格的文件



你好,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将反斜杠解释为转义序列(。

最新更新