5

コマンドで見つかったすべてのファイルに対してexpandshellコマンドを実行しようとしていますfind。-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
4

2 に答える 2

10

コマンドが機能しない理由は2つあります。

  1. 出力リダイレクトは、ではなくシェルによって行われfindます。findこれは、シェルが出力をファイルにリダイレクトすることを意味します{}
  2. リダイレクトはすぐに発生します。つまり、expandコマンドによって読み取られる前でも、ファイルは書き込まれます。そのため、コマンドの出力を入力ファイルにリダイレクトすることはできません。

残念ながらexpand、その出力をファイルに書き込むことはできません。したがって、出力リダイレクトを使用する必要があります。を使用する場合は、を実行し、出力を一時ファイルにリダイレクトして、一時ファイルを元のファイルに戻すようにbash定義できます。問題は、コマンドを実行するために新しいシェルを実行することです。functionexpandfindexpand

しかし、解決策があります:

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を使用して関数をサブシェルにエクスポートしていますexport -f。また、をexpand使用して自分自身を実行するのではなく、エクスポートされfind -execたを実行するnewを実行します。bashexpand_func

于 2011-07-13T17:53:46.480 に答える
1

「拡張」は実際には問題の価値がありません。代わりにsedを使用できます。

find . -name "*.php" | xargs sed -i -e 's/\t/    /g'
于 2013-09-09T15:25:21.833 に答える