我想在我的外部磁盘上找到某些文件并删除它们。我创建了以下脚本(为了测试,我仅使用 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
您应该将您的输入管道输入find
到while read
:
find ... | while read i
答案3
不要使用for ...
,而要使用while read
,如下所示:
find .... | while read LINE ; do
ls "$LINE"
done
它会一次读取一行并将其放入LINE
变量中。因此,find 是否转义空格并不重要。我还将 ls 括在"
's 中,以防止那里的空格弄乱它