複数の引数置換を持つXargs - sh -c '...'の後に環境変数引数を使用する

複数の引数置換を持つXargs - sh -c '...'の後に環境変数引数を使用する

これは私のコマンドです:

find $1 -name "*.html"  | sort -n | xargs -I {} sh -c 'echo "Dumping file: "{} >> "$2"; w3m {} >> "$2" 2>&1'

どこ:

$ 1は、拡張子が.htmlのファイルを見つけるパスです。

$ 2は情報を記録したいファイルです(ダンプファイル:* htmlとこのhtmlファイルに含まれる情報)。

問題は、2ドルが解釈されないことです。おそらく、この変数は '...'の間で二重引用符を使用してみましたが、コマンドは機能しませんでした。

私のコマンドラインに$ 2情報を渡す方法を知っている人はいますか?

答え1

find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 -n 1 sh -c '
   echo "Dumping file: $2" >> "$1"; w3m "$2" >> "$1" 2>&1
' sh "$2"

別の最適化は次のとおりです。

find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 -n 1 sh -c '
   exec 1>> "$1" 2>&1
   echo "Dumping file: $2"
   w3m "$2"
' sh "$2"

echoどちらのコマンドもw3mファイル記述子 1 と 2 を使用して同じことを行うので、最初から 1 つの場所で実行するのが最善です。

sh各ファイルに1つずつ実行する必要はありません。

find "$1" -name "*.html" -print0 | sort -zn | xargs -r -0 sh -c '
   out=$1; shift
   for file do
     echo "Dumping file: $file"
     w3m "$file"
   done >> "$out" 2>&1
' sh "$2"

答え2

一重引用符から削除します。

... sh -c 'echo "Dumping file: "{} >> '"$2"'; w3m {} >> '"$2"' 2>&1'

シェルはすべてを一つにまとめます。

答え3

参照の問題を解決するいくつかの方法は、sh変数を内部引数として渡すことです。

log=$2
... | xargs -I {} sh -c 'echo "Dumping file: $1" >> "$2"; w3m {} >> "$2" 2>&1' sh {} "$log"

あるいは、export関連変数のみを名前で参照できます。

export log=$2
... | xargs -I {} sh -c 'echo "Dumping file: $1" >> "$log"; w3m {} >> "$log" 2>&1' sh {} 

ただし、ファイル名が奇妙な場合は、findプレーンがxargs -L正しく機能しない可能性があることに注意してください。改行文字と-L末尾のスペースは特別に扱われます。

関連情報