wget - 사용자 정의 폴더 구조를 사용하여 CSV에서 파일 목록을 다운로드하는 방법

wget - 사용자 정의 폴더 구조를 사용하여 CSV에서 파일 목록을 다운로드하는 방법

2개의 열, ID 및 로 구분된 이미지 URL 목록이 있는 CSV가 있습니다. |파일 수는 가변적입니다. 예를 들면 다음과 같습니다.

ID_0;https://via.placeholder.com/350x150.jpg|https://via.placeholder.com/250x150.jpg
ID_1;https://via.placeholder.com/350x150.jpg|https://via.placeholder.com/250x150.jpg
ID_2;https://via.placeholder.com/450x150.jpg

wgetID 값으로 명명된 폴더의 모든 이미지를 다운로드하는 방법이 있습니까 ?

편집하다:

지금까지 시도한 내용은 다음과 같습니다.

#!/bin/bash

while IFS=';' read -r product_code img
do
    wget $img -P $product_code
done < test.csv

答え1

간단한 방법:

#!/bin/bash

while read -r id urls; do
    ( mkdir -p "$id" && cd "$id" && wget $urls )
done < <(sed 's/[|;]/ /g' file)

산출

ls ID_*
ID_0:
250x150.jpg  350x150.jpg

ID_1:
250x150.jpg  350x150.jpg

答え2

이것이 내가 생각해낸 해결책이다:

#!/bin/bash

while IFS=';' read -r product_code image_list # Parse each line of the CSV and assing its ; separated values
do
    img_array=( $(echo "$image_list" | tr "|" "\n") ) # Create an Array of urls starting from a | separated string
    for image in "${img_array[@]}" # Parse each element of the Array
    do
        wget "$image" -P "$product_code" # Download Image in specific folder
    done
done < test.csv

입력 파일과 관련된 조건은 다음과 같습니다.

  • 첫 번째 열 은 , 및 공백을 product_code포함할 수 있는 문자열입니다 .A-z0-9_
  • 두 번째 열은 image_list문자로 구분된 가변 길이의 URL 목록입니다 |. 각 파일 이름에는 A-z, 0-9, _;

答え3

tr ';|' '\t\t' <file | xargs -L 1 sh -c 'dir=$1; shift; wget -q -P "$dir" "$@"' sh

이는 ID와 URL에 문자 ;|공백 문자가 포함되어 있지 않다고 가정합니다. 각각과 문자를 탭 문자로 바꾼 다음 ;각 입력 줄(탭에서 별도의 문자열로 구분됨)을 인수로 사용하여 짧은 인라인 셸 스크립트를 반복적으로 호출합니다.|xargs

짧은 인라인 셸 스크립트는 첫 번째 명령줄 인수 ID를 변수로 전송 dir한 다음 wget이를 -P옵션( --directory-prefix)에 대한 인수로 호출하고 나머지 인수를 URL 피연산자로 호출합니다.

시험:

$ tree
.
`-- file

0 directories, 1 file
$ tr ';|' '\t\t' <file | xargs -L 1 sh -c 'dir=$1; shift; wget -q -P "$dir" "$@"' sh
$ tree
.
|-- ID_0
|   |-- 250x150.jpg
|   `-- 350x150.jpg
|-- ID_1
|   |-- 250x150.jpg
|   `-- 350x150.jpg
|-- ID_2
|   `-- 450x150.jpg
`-- file

3 directories, 6 files

지원하는 경우 xargs병렬로 실행하면서 (일부 숫자, 예: 4)를 사용하여 이 작업을 수행할 수 있습니다.-P nnxargs


게으른 경우 위의 내용을 단순화하여

tr ';|' '\t\t' <file | xargs -L 1 sh -c 'wget -q -P "$0" "$@"'

sh -c...우리는 첫 번째 피연산자가 에 저장되어 있고 $0이것이 위치 인수 목록의 일부가 아니라는 사실을 남용하고 있습니다 "$@". 그러나 내부에 스크립트나 셸의 이름을 넣는 것이 관례입니다(이는 구분 기호 위의 코드에서 뒤에 오는 이름입니다 $0). sh쉘은 $0진단 메시지에 사용됩니다.

答え4

GNU 병렬이 있는 경우:

cat file |
  parallel --colsep '[|;]' 'mkdir -p {1} && cd {1} && wget {=1 $arg[1]=""; $_="@arg"; uq(); =}'

Explanation:
  $arg[1]="" -- remove first argument
  $_="@arg" -- join arguments with " "
  uq() -- do not quote the result

또는:

cat file |
  parallel --colsep ';' 'mkdir -p {1} && cd {1} && wget {=2 s/\|/ /g; uq(); =}'

Explanation:
  2 s/\|/ /g -- replace | with " " in argument 2

이는 더 많은 URL을 동시에 다운로드하는 데 편리할 수 있습니다.

関連情報