替换为 find 命令的“...”多行输出

替换为 find 命令的“...”多行输出

我需要将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 {} +

相关内容