다운로드하려는 이미지에 대한 링크 목록이 포함된 .txt 파일이 있다고 가정해 보겠습니다. 예:
image.jpg
image2.jpg
image3.jpg
내가 사용하는 것은: cat images.txt | xargs wget
그리고 그것은 훌륭하게 작동합니다
지금 하고 싶은 일은 다음 형식의 또 다른 .txt 파일을 제공하는 것입니다.
some_id1 image.jpg
some_id2 image2.jpg
some_id3 image3.jpg
내가 하고 싶은 일은 ' ' 안의 각 줄을 분할하고 오른쪽에 있는 링크를 다운로드한 다음 왼쪽에 제공된 ID를 사용하여 다운로드한 파일 이름을 변경하는 것입니다.
각 개별 행에 대해 어떻게든 wget image.jpg -O some_id1.jpg를 사용하고 싶습니다.
따라서 출력은 다음과 같습니다.
some_id1.jpg
some_id2.jpg
some_id3.jpg
어떤 아이디어가 있나요?
답변1
이것은 당신의 일을 할 수 있습니다
while read a b
do
wget "$b" -O "$a".jpg
printf "$a".jpg"\n%s" >> newfile
done < images.txt
답변2
테스트하려면:
$ awk '{ ext=gensub(/.*(\.[^.]*$)/,"\\1",1);
print "wget " $2 " -O " $1 ext}' images.txt
wget image.jpg -O some_id1.jpg
wget image2.jpg -O some_id2.jpg
wget image3.jpg -O some_id3.jpg
실행하려면 파이프를 입력 bash
하거나 sh
다음과 같이 입력하세요.
awk '{ ext=gensub(/.*(\.[^.]*$)/,"\\1",1);
print "wget " $2 " -O " $1 ext}' images.txt |
bash
필요한 경우 인쇄 문에 작은따옴표를 추가합니다(예: 필드가 탭으로 구분되어 있고 필드에 셸에 문제를 일으키는 공백이나 기타 문자가 포함될 수 있는 경우). 또는 필드 2에 & 기호 &
, 세미콜론 ;
, 등 전체 URL). 예를 들어
awk '{ ext=gensub(/.*(\.[^.]*$)/,"\\1",1);
print "wget '\''" $2 "'\'' -O '\''" $1 ext"'\''"}' images.txt
wget 'image.jpg' -O 'some_id1.jpg'
wget 'image2.jpg' -O 'some_id2.jpg'
wget 'image3.jpg' -O 'some_id3.jpg'
그건 그렇고, 작은 따옴표로 묶인 문자열에 작은 따옴표를 삽입하는 방법은 다음과 같습니다. ( '\''
작은 따옴표 끝, 백슬래시로 이스케이프 처리된 작은 따옴표, 작은 따옴표 다시 시작)
추가 정보:
1. $2에 하나 이상의 아포스트로피가 포함될 수 있는 경우 명령문 앞에 추가 처리를 수행 해야 할 수도 있습니다 $2
(awk 함수 사용 ). 예를 들어gsub()
print
gsub(/'\''/,"'"'\\\\''"'",$2);
거의 읽을 수 없는 작은따옴표, 큰따옴표, 슬래시 및 백슬래시로 인해 '
두 번째 필드의 모든 s가 로 변환됩니다 . 때때로 인용은 정말 고통스럽습니다(비록 스크립트에서는 작은따옴표가 있는 한 줄만큼 보기 흉 '\''
하지는 않습니다). #!/usr/bin/awk -f
).
2. 또는 URL인 경우 작은따옴표를 아포스트로피의 URL 엔터티 인코딩인 $2
로 변경하는 것이 좋습니다 . %27
쉘은 % 기호에 대해 신경 쓰지 않으며 작은 따옴표 안에 있는지 여부도 확실히 신경 쓰지 않지만 따옴표에는 매우 신경을 씁니다.
마찬가지로 확장자를 추출할 때 모든 구두점을 제외할 수도 있습니다. 예를 들어
ext=gensub(/.*(\.[^[:punct:]]*)/,"\\1",1);
그러나 URL과 같이 이미지 파일 이름이 삽입된 위치와 방법에 따라 상당히 복잡해질 수 있다는 점에 유의하세요.
답변3
awk를 사용하세요:
awk '{split($2, p, "."); system(sprintf("wget -O %s.%s %s\n", $1, p[length(p)], $2))}' images.txt
무너지다
먼저 awk를 사용하여 원하는 명령을 대략적으로 인쇄합니다.
awk '{printf("wget -O %s %s\n", $1, $2)}' images.txt
그런 다음 URL을 "."으로 분할하여 확장자를 추출합니다. 첫 번째 매개변수에 추가합니다.
awk '{split($2, p, "."); printf("wget -O %s.%s %s\n", $1, p[length(p)], $2)}' images.txt
마지막으로 printf를 sprintf로 변경하고 시스템 명령에 랩을 넣어 awk가 명령을 실행하도록 합니다.
awk '{split($2, p, "."); system(sprintf("wget -O %s.%s %s\n", $1, p[length(p)], $2))}' images.txt