如何处理脚本中的空格

如何处理脚本中的空格

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

for i in `find /media/My\ Book/ -name "OP_CACHE.IDX" -print`; 
  do ls $i; 
done

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

我该如何解决空格问题?是否有查找标志,或者其他类似的东西?

问候马克

答案1

那里的标志find,其使用方式如下:

找到“/media/My Book”-name“OP_CACHE.IDX”-exec ls {} \;

这也可以用来:

查找“/media/My Book”-name“OP_CACHE.IDX”-print0 | xargs -0 ls

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


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

找到“/media/My Book”-name“OP_CACHE.IDX”-删除

(您甚至可以使用-print -delete它来查看每个被删除的文件。)


如果你确实必须使用 bash 循环,那么大多数情况下这样做都会有效:

找到“/media/My Book”-name“OP_CACHE.IDX”| 读取文件时;做
  ls“$文件”
完毕

但请参见上面的评论-print0

答案2

您应该将您的输入管道输入findwhile read

find ... | while read i

答案3

不要使用for ...,而要使用while read,如下所示:

find .... | while read LINE ; do
  ls "$LINE"
done

它会一次读取一行并将其放入LINE变量中。因此,find 是否转义空格并不重要。我还将 ls 括在"'s 中,以防止那里的空格弄乱它

相关内容