运行展开查找结果

时间:2011-07-13 10:24:40

标签: linux unix find expand xargs

我正在尝试对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

2 个答案:

答案 0 :(得分:8)

您的命令不起作用有两个原因。

  1. 输出重定向由shell完成,而不是由find完成。这意味着shell会将find的输出重定向到文件{}
  2. 重定向会立即发生。这意味着即使在expand命令读取之前,也会写入文件。因此,无法将命令的输出重定向到输入文件中。
  3. 不幸的是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'