これは私のコマンドです:
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
末尾のスペースは特別に扱われます。