이것은 내 명령입니다:
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를 사용하여 동일한 작업을 수행하므로 처음부터 한 곳에서 수행하는 것이 가장 좋습니다.
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
plain이 xargs -L
제대로 작동하지 않을 수 있다는 점에 유의하세요. 개행 문자와 -L
후행 공백은 특별히 취급됩니다.