特定のバケットには、特定のパターンに基づいていくつかのファイルをローカルにダウンロードするために通常使用される何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