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
wget
ID 값으로 명명된 폴더의 모든 이미지를 다운로드하는 방법이 있습니까 ?
편집하다:
지금까지 시도한 내용은 다음과 같습니다.
#!/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-z
0-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 n
n
xargs
게으른 경우 위의 내용을 단순화하여
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을 동시에 다운로드하는 데 편리할 수 있습니다.