Shell 删除文件名中带/不带空格的文件

Shell 删除文件名中带/不带空格的文件,shell,find,Shell,Find,大家好,我的社区, 我在删除文件名中包含空格的文件时遇到了一个问题,我有这部分代码负责删除从目录中获取的文件 for f in $(find $REP -type f -name "$Filtre" -mtime +${DelAvtPurge}) do rm -f $f 我知道单引号或双引号可以用来删除带有空格的文件,当我在命令行中尝试它们时,它对我很有效,但当我将它们放在文件的$f中时,它根本不起作用。 有谁能帮我找到解决方案吗?GNU find已经-删除: find "$REP

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

for f in $(find  $REP  -type f -name "$Filtre" -mtime +${DelAvtPurge})
do
    rm -f $f
我知道单引号或双引号可以用来删除带有空格的文件,当我在命令行中尝试它们时,它对我很有效,但当我将它们放在文件的$f中时,它根本不起作用。
有谁能帮我找到解决方案吗?

GNU find已经
-删除

find "$REP" -type f -name "$Filtre" -mtime +"$DelAvtPurge" -delete
对于任何其他
find
实现,您可以使用bulk exec:

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
以空字符而不是换行符分隔命中。相应地,
IFS=read-r-d'
读取以空字符分隔的输入字符串,我们在循环中使用
-r
选项防止
read
将反斜杠解释为转义序列)。

问题不在Find命令中,问题在rm-f$f行,如果此函数是这样的,则代码的其余部分如下:对于“$(find$REP-type f-name“$filter”-mtime+${DelAvtPurge}”中的f,如果[$?=0],则执行rm-f$f,然后FctMsg“${code\u ERR\u OK}”${FIC\u TRC}”清除OK pour le fichier${f}”否则FctMsg code\u ERR WAR}”${FIC\u TRC}“Probleme pour purger le fichier${f}”fidone@amy你也可以用find完成所有这些,我刚刚演示了如何用find删除文件。顺便说一句,解析find的输出并不是一个好主意,这是一个反模式的最好方法,如果我添加了-delete选项,我是否必须删除rm行和“if…”。。。else的行?为什么解析find的输出不是一个好主意?如果可以的话,你能给我更多的解释吗?谢谢@Konrad,你能告诉我这个选项-print0 | read-r-d''f有什么作用吗?@amyhart它用零字符而不是换行符来分隔
find
的输出项。这是可以保证工作的,因为零字符在文件名中是无效的(而换行符是无效的!)。查看
查找
手册页和,了解更多详细信息。我将尝试此解决方案并告诉您结果,感谢您的支持answer@amyhart哎呀,我刚注意到我的密码漏掉了一个字。现在修好了。我已经试过了,但它也不起作用,我想问题就在这里,如果s=while read-r-d''f;是的,这行写得不正确,在查找之前已经有一个for循环