Bash

... 替換 find 命令的多行輸出

  • April 7, 2016

我需要將命令的輸出替換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

謝謝你。

PS我不確定它是否重要或不言自明,但是

mdls "/Users/shau-kote/target_dir//secondsomefile"

工作正常。

使用find-exec命令:

find ~/target_dir/ -iname '*some*' -depth 1 -exec mdls {} \;

這將在 .mdls找到的每個匹配文件名上執行find。它適用於任何文件名,甚至包含空格或換行符等的文件名。

如果mdls可以在命令行上使用多個文件名,則可以使用而不是終止-exec命令。例如+``\;

find ~/target_dir/ -iname '*some*' -depth 1 -exec mdls {} +

引用自:https://unix.stackexchange.com/questions/274837