我需要将find
命令的输出替换为另一个命令来处理每个找到的文件,例如:
mdls `find ~/target_dir/ -iname '*some*' -depth 1`
(mdls
是 OS X 中的一个命令,用于获取指定文件的元数据属性。它不支持管道,因此find ... | mdls
失败。)
上面的命令工作正常,但预期在名称中带有空格的文件上失败。我认为通过添加引号sed
有助于解决这个问题:
$ find ~/target_dir/ -iname '*some*' -depth 1 | sed 's/\(.*\)/"\1"/'
"/Users/shau-kote/target_dir//secondsomefile"
"/Users/shau-kote/target_dir//some file with spaces in name"
"/Users/shau-kote/target_dir//somefile"
唉,现在我的mdls
命令对所有文件都失败了:
$ mdls `find ~/target_dir/ -iname '*some*' -depth 1 | sed 's/\(.*\)/"\1"/'`
"/Users/shau-kote/target_dir//secondsomefile": could not find "/Users/shau-kote/target_dir//secondsomefile".
我该如何修复它以便mdls
正确处理来自的所有文件名find
?
谢谢。
聚苯乙烯我不确定这是否重要或不言而喻,但是
mdls "/Users/shau-kote/target_dir//secondsomefile"
工作正常。
答案1
使用find
的-exec
命令:
find ~/target_dir/ -iname '*some*' -depth 1 -exec mdls {} \;
这将mdls
在 . 找到的每个匹配文件名上运行find
。它适用于任何文件名,甚至包含空格或换行符等的文件名。
如果mdls
可以在命令行上使用多个文件名,您可以-exec
使用+
而不是终止命令\;
。例如
find ~/target_dir/ -iname '*some*' -depth 1 -exec mdls {} +