.txt 파일의 각 줄에 액세스하고 링크를 다운로드하고 이름을 바꿉니다.

.txt 파일의 각 줄에 액세스하고 링크를 다운로드하고 이름을 바꿉니다.

다운로드하려는 이미지에 대한 링크 목록이 포함된 .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

무너지다

  1. 먼저 awk를 사용하여 원하는 명령을 대략적으로 인쇄합니다.

    awk '{printf("wget -O %s %s\n", $1, $2)}' images.txt
    
  2. 그런 다음 URL을 "."으로 분할하여 확장자를 추출합니다. 첫 번째 매개변수에 추가합니다.

    awk '{split($2, p, "."); printf("wget -O %s.%s %s\n", $1, p[length(p)], $2)}' images.txt
    
  3. 마지막으로 printf를 sprintf로 변경하고 시스템 명령에 랩을 넣어 awk가 명령을 실행하도록 합니다.

    awk '{split($2, p, "."); system(sprintf("wget -O %s.%s %s\n", $1, p[length(p)], $2))}' images.txt
    

관련 정보