我正在尝试对find
命令找到的所有文件运行expand shell命令。我试过-exec和xargs但都失败了。谁能解释我为什么?我在Mac上备案。
find . -name "*.php" -exec expand -t 4 {} > {} \;
这只是创建一个包含所有输出的文件{}
,而不是覆盖每个单独找到的文件本身。
find . -name "*.php" -print0 | xargs -0 -I expand -t 4 {} > {}
这只是输出
4 {}
xargs: 4: No such file or directory
答案 0 :(得分:8)
您的命令不起作用有两个原因。
find
完成。这意味着shell会将find
的输出重定向到文件{}
。expand
命令读取之前,也会写入文件。因此,无法将命令的输出重定向到输入文件中。不幸的是expand
不允许将其输出写入文件。所以你必须使用输出重定向。如果使用bash
,则可以定义执行function
的{{1}},将输出重定向到临时文件,并将临时文件移回原始文件。问题是expand
将运行一个新的shell来执行find
命令。
但有一个解决方案:
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 {}' \;
将函数expand_func
导出到子shell。并且您不会使用export -f
执行expand
,而是执行新的find -exec
来执行导出的bash
。
答案 1 :(得分:1)
'扩大'并不值得这么麻烦。 你可以改用sed:
find . -name "*.php" | xargs sed -i -e 's/\t/ /g'