0

簡単に言うと、次のようなスクリプト チャンクがあります。

cd ${1} # via command-line argument
find . -name "output*.txt" | xargs cat ${1} | grep -v ${filter} > temp.txt

私は基本的にfind ...、コマンドラインで行を作成し、それをスクリプトに貼り付けてから、cdコマンドを追加して、このスクリプトを大規模なディレクトリセットで実行するラッパーで簡単に再利用できるようにしました。ともかく ...

問題は、同じ変数cdを使用することです。xargs${1}

${1}から引数を削除できることはわかっていxargsます。おそらく、findコマンドをまったく必要としないように書き直すこともできますxargsが、私の質問は残ります。

${1}使用後に「リセット」する方法はありcdますxargsか?

4

3 に答える 3

2

デフォルトの置換文字列としてxargs使用するバージョンには慣れていませんが、次のように動作するはずです。${1}

find . -name "output*.txt" | xargs -I '{}' cat '{}' | grep -v ${filter} > temp.txt
于 2013-03-25T21:16:49.650 に答える
0

ユーティリティ xargs は引数の数を管理するためのものであり、中括弧は引数またはファイル名 {} のプレースホルダーとして機能します。

私はあなたが持っているラッパーをシミュレートしましたが、私の関数に ${1} として渡されたパス名が xargs によって取得されたのと同じ問題がありました ...... しかし、これはシェルがどのように機能するかであり、実際にはシェルはすべてを置換/展開するだけです実行前にコマンドを完了するための変数ともの

ユーティリティ arnt は、これを自分で処理するようにコーディングされています。

echo * ;

ここで、シェルは展開 * し、現在のディレクトリ内のすべてのファイル名に置き換えて、コマンド echo を実行する前に @ 引数として echo ユーティリティに渡します *

同様に、あなたの場合、シェルは ${1} を、コマンドを実行する前に渡したパス名の値に展開しています。

解決策:中かっこ(もちろん空)を使用するか、ドロップするだけでよいでしょう.......私にとってはうまくいきます.....

find . -iname "*${filename}*" | xargs ls -l | more commands ....;

お役に立てれば 。

于 2013-03-26T08:17:24.807 に答える