具有多个参数替换的 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"

One more optimization can be:

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"

由于命令echow3m都使用文件描述符 1 和 2 执行相同的操作,因此最好一开始就在一个地方执行此操作。

您还可以避免sh为每个文件运行一个:

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则plainxargs -L可能会工作得很糟糕:显然是换行符,并且-L特别对待尾随空格。

相关内容