특정 버킷에는 특정 패턴에 따라 일부 파일을 로컬로 다운로드하는 GCS
데 일반적으로 사용하는 수백만 개의 파일이 있습니다.GSUTIL
gsutil -m cp -R "gs://test-bucket-data-ingest/cm_data/AAA_AN/CM/*/a02_*_20210126*.csv.bz2" /home/xyz/testfiles/
나는 서버에서 실행 Linux
하고 이러한 파일을 다운로드합니다. 다운로드하는데 시간이 많이 걸립니다.
그런 다음 압축을 풀고 빈 파일을 찾습니다.
bzip2 -d /home/xyz/testfiles/*
find . -name '*.csv' -size 0
파일을 다운로드하는 가장 빠르고 효율적인 방법을 찾고 있으며 이러한 모든 명령을 스크립트로 결합할 수 있는지... 일종의 매개변수화된 방식을 찾고 있습니다.
gsutil ls -l
그래도 더 빠르게 작동합니다. 이것을 grep과 결합하여 빈 파일만 목록을 얻고 해당 특정 파일만 다운로드할 수 있습니다.
답변1
글쎄, 나는 이것을 답변으로 게시하고 있지만 새로운 답변은 언제나 환영합니다.
GSUTIL
수백만 또는 수천 개의 파일을 검색해야 하는 경우 일부 패턴 일치 작업은 매우 느릴 수 있습니다. 먼저 목록을 나열하고 절대 파일 경로를 사용하여 파일을 다운로드하는 것이 좋습니다.
vikrant_singh_rana@cloudshell:~/download$ cat download_gcs_file.sh
#!/bin/bash
#below code will delete the file if it already exists in the current working directory
file="ls_output.csv"
if [ -f "$file" ] ; then
rm "$file"
fi
#below code will list the files to output file ls_output.csv based on search pattern
gsutil ls -l "gs://test-bucket-data-prod-ingest/cm_data/AN/AM/*/a01_*_20210128*.csv.bz2" | awk '!hdr{ print "filename"; hdr=1; }; $1 <= 100{ print $3; }' >ls_output.csv
input_file_path='/home/vikrant_singh_rana/download/ls_output.csv'
#below code will read the input file name and download it from gcs location to local
count=0
{
read
while IFS=, read -r inputfilename
do
echo "input filename is:"$inputfilename
if [ ! -z "$inputfilename" ] || [ "$inputfilename" != "filename" ]
then
echo "downloading file:" $inputfilename
gsutil -m cp -R "$inputfilename" /home/vikrant_singh_rana/download/output/
else echo "No Empty Files found"
fi
count=$[count + 1]
echo "count is:" $count
done
} < $input_file_path
#below will unzip the files to csv format
bzip2 -d /home/vikrant_singh_rana/download/output/*
입력 파일입니다
vikrant_singh_rana@cloudshell:~/download$ cat ls_output.csv
filename
gs://test-bucket-data-prod-ingest/cm_data/AN/AM/172.24.105.197-CORE-2/a01_1h_255_XYZ_202101282300_0009.csv.bz2