次のコマンドを実行しようとしています。
find . -iname '.#*' -print0 | xargs -0 -L 1 foobar
ここで、「foobar」は、.bashrc ファイルで定義されたエイリアスまたは関数です (私の場合、1 つのパラメーターを受け取る関数です)。どうやら xargs はこれらを実行できるものとして認識していません。これを改善する賢い方法はありますか?
次のコマンドを実行しようとしています。
find . -iname '.#*' -print0 | xargs -0 -L 1 foobar
ここで、「foobar」は、.bashrc ファイルで定義されたエイリアスまたは関数です (私の場合、1 つのパラメーターを受け取る関数です)。どうやら xargs はこれらを実行できるものとして認識していません。これを改善する賢い方法はありますか?
インタラクティブシェルだけがエイリアスについて知っているので、フォークアウトせずにエイリアスを実行してみませんxargsか?
find . -iname '.#*' -print0 | while read -r -d '' i; do foobar "$i"; done
ファイル名に改行が含まれていないことが確実な場合(ええ、なぜそうなるのでしょうか?)、これを次のように簡略化できます。
find . -iname '.#*' -print | while read -r i; do foobar "$i"; done
またはfind -iname '.#*' | ...、デフォルトのディレクトリが.であり、デフォルトのアクションがであるため、単に-print。
もう1つの選択肢:
IFS=$'\n'; for i in `find -iname '.#*'`; do foobar "$i"; done
単語は改行でのみ分割されることをBashに伝えます(デフォルト:) IFS=$' \t\n'。ただし、これには注意する必要があります。一部のスクリプトは、変更にうまく対応できません$IFS。
Bash を使用すると、エイリアス (または関数) に渡す引数の数を次のように指定することもできます。
alias myFuncOrAlias='echo' # alias defined in your ~/.bashrc, ~/.profile, ...
echo arg1 arg2 | xargs -n 1 bash -cil 'myFuncOrAlias "$1"' arg0
echo arg1 arg2 | xargs bash -cil 'myFuncOrAlias "$@"' arg0
パラメータとして指定されたプログラムxargsにできることを期待しているため、これは機能しません。exec
foobarあなたの場合は単なるエイリアスまたは関数であるためbash、実行するプログラムはありません。
bashによって返されるファイルごとに開始する必要findがありますが、次のように小さなシェル スクリプトを作成できます。
#!/bin/bash
. $(HOME)/.bashrc
func $*
次に、そのスクリプトの名前をパラメーターとして渡しますxargs
私は通常、次のように find を使用します。
find . -iname '' -exec cmd '{}' \;
'{}' はファイル名と \; に置き換えられます。実行チェーンを終了するために必要です。ただし、それが関数で機能しない場合は、bash を介して実行する必要がある場合があります。
find .. |sed -e "s/.*/cmd '&'/"|bash
Find は各ファイルを 1 行に出力し、sed はこれにコマンドのプレフィックスを付けてから、実行のために bash にパイプします。最初に |bash をスキップして、何が起こるかを確認してください。
試す
find . -iname '.#*' -print0 | xargs -0 -L 1 $(foobar)