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

时间:2019-11-19 10:14:30

标签: shell

您好stackoverflow社区, 我在删除文件名中包含空格的文件时遇到了问题,我拥有这部分代码,负责删除从目录中获取的文件,

for f in $(find  $REP  -type f -name "$Filtre" -mtime +${DelAvtPurge})
do
    rm -f $f

我知道单引号或双引号可用于删除带空格的文件,当我在命令行中尝试使用它们时,它对我有用,但是当我将它们放在文件中的$ f中时,它根本不起作用。 有人可以帮我找到解决方案吗?

2 个答案:

答案 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将反斜杠解释为转义序列)。