这是我的命令:
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"
由于命令echo
和w3m
都使用文件描述符 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
特别对待尾随空格。