如何处理脚本中的空格

los*_*and 2 linux bash

我想在我的外部光盘上找到某些文件并删除它们。我创建了以下脚本(为了测试我只使用 ls $i 来检查输出)

for i in `find /media/My\ Book/ -name "OP_CACHE.IDX" -print`; 
  do ls $i; 
done
Run Code Online (Sandbox Code Playgroud)

问题是,查找命令仅返回未编码空格(例如“我的书”)的字符串(就像我在 /media/My\ Book 中所做的那样),因此我收到无法找到文件夹的错误。

如何用空格解决这个问题?是否有用于查找的标志或其他什么东西?

马克

use*_*686 5

一个标志find,它的使用是这样的:

find "/media/My Book" -name "OP_CACHE.IDX" -exec ls {} \;

这也可以使用:

find "/media/My Book" -name "OP_CACHE.IDX" -print0 | xargs -0 ls

(该-print0参数告诉find用空字节而不是换行符分隔文件名。在大多数现代文件系统(例如 ext3 和 NTFS)中,文件名不仅可以包含空格,还可以包含换行符、制表符、除空字节之外的所有内容。虽然不太可能对于你自己的磁盘有这样的文件名,我倾向于小心。)


如果您打算稍后删除文件,find也可以这样做:

find "/media/My Book" -name "OP_CACHE.IDX" -delete

(您甚至可以-print -delete在每个文件被删除时查看它。)


如果您绝对必须使用 bash 循环,这将在大多数情况下起作用:

find "/media/My Book" -name "OP_CACHE.IDX" | 读取文件时;做
  ls "$文件"
完毕

但请参阅-print0上面的评论。