我正在尝试对 find
命令找到的所有文件运行 expand shell 命令。我试过 -exec 和 xargs 但都失败了。谁能解释我为什么?我正在使用 Mac 进行记录。
找到 . -name "*.php"-exec expand -t 4 {} > {}\;
这只是创建一个包含所有输出的文件 {}
,而不是覆盖每个单独找到的文件本身。
找到 . -name "*.php"-print0 | xargs -0 -I expand -t 4 {} > {}
这只是输出
4 {}
xargs: 4: No such file or directory
最佳答案
您的命令不工作有两个原因。
- 输出重定向是由 shell 而不是
find
完成的。这意味着 shell 会将find
的输出重定向到文件{}
。 - 重定向将立即发生。这意味着文件甚至会在
expand
命令读取之前就被写入。因此不可能将命令的输出重定向到输入文件。
不幸的是,expand
不允许将其输出写入文件。所以你必须使用输出重定向。如果您使用 bash
,您可以定义一个 function
来执行 expand
,将输出重定向到一个临时文件并将临时文件移回原始文件文件。问题是 find
将运行一个新的 shell 来执行 expand
命令。
但是有一个解决办法:
expand_func () {
expand -t 4 "$1" > "$1.tmp"
mv "$1.tmp" "$1"
}
export -f expand_func
find . -name \*.php -exec bash -c 'expand_func {}' \;
您正在使用 export -f
将函数 expand_func
导出到子 shell。并且您不使用 find -exec
执行 expand
本身,而是执行一个新的 bash
来执行导出的 expand_func
.
关于linux - 对查找结果运行扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6677441/