linux - 对查找结果运行扩展

标签 linux unix find expand xargs

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

最佳答案

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

  1. 输出重定向是由 shell 而不是 find 完成的。这意味着 shell 会将 find 的输出重定向到文件 {}
  2. 重定向将立即发生。这意味着文件甚至会在 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/

相关文章:

android - 无法在 Android 模拟器上运行应用程序 : error message kvm is required to run AVD

linux - 将文件从源复制到目标的 Bash Shell 脚本

unix - 如何使用 Unix 命令行工具将文件的行按 100 行 block 进行打乱?

macos - 从命令行杀死所有进程

javascript - 为什么 `.innerText` 属性在 Firefox 中不起作用?

linux - 有没有办法找到一个特定的文件,然后一次性切换到包含它的目录?

linux - direct_io失败的原因

linux - MATLAB 中的最大波特率是多少?

python - 在文件中突出但不完全重复的行

java - 在 Eclipse 项目中查找方法调用