66

次のコマンドを実行しようとしています。

find . -iname '.#*' -print0 | xargs -0 -L 1 foobar

ここで、「foobar」は、.bashrc ファイルで定義されたエイリアスまたは関数です (私の場合、1 つのパラメーターを受け取る関数です)。どうやら xargs はこれらを実行できるものとして認識していません。これを改善する賢い方法はありますか?

4

6 に答える 6

38

インタラクティブシェルだけがエイリアスについて知っているので、フォークアウトせずにエイリアスを実行してみません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

于 2009-02-04T22:53:22.803 に答える
11

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
于 2010-07-19T10:26:21.267 に答える
5

パラメータとして指定されたプログラムxargsにできることを期待しているため、これは機能しません。exec

foobarあなたの場合は単なるエイリアスまたは関数であるためbash、実行するプログラムはありません。

bashによって返されるファイルごとに開始する必要findがありますが、次のように小さなシェル スクリプトを作成できます。

#!/bin/bash
. $(HOME)/.bashrc
func $*

次に、そのスクリプトの名前をパラメーターとして渡しますxargs

于 2009-02-04T22:18:33.467 に答える
1

私は通常、次のように find を使用します。

find . -iname '' -exec cmd '{}' \;

'{}' はファイル名と \; に置き換えられます。実行チェーンを終了するために必要です。ただし、それが関数で機能しない場合は、bash を介して実行する必要がある場合があります。

find .. |sed -e "s/.*/cmd '&'/"|bash

Find は各ファイルを 1 行に出力し、sed はこれにコマンドのプレフィックスを付けてから、実行のために bash にパイプします。最初に |bash をスキップして、何が起こるかを確認してください。

于 2009-02-04T22:16:47.603 に答える
0

試す

find . -iname '.#*' -print0 | xargs -0 -L 1 $(foobar)
于 2018-10-23T11:26:56.197 に答える