2017-12-07 59 views
1

Googleのクラウドストレージにバケットがあります。バケツにtmpフォルダがあります。毎日このディレクトリに何千ものファイルが作成されています。毎晩1日以上経過したファイルを削除したい。私はこの仕事のためにgsutilに関する議論を見つけることができませんでした。これを行うには、古典的でシンプルなシェルスクリプトを使用しなければなりませんでした。しかし、ファイルは非常にゆっくり削除されています。最後の日から古いファイルを削除するgsutilコマンド

フォルダに650Kのファイルが蓄積されています。それらのうち540Kは削除する必要があります。しかし、自分のシェルスクリプトは1日働いていて、34Kファイルしか削除できませんでした。

gsutilライフサイクル機能は、私が望むものを正確に行うことができません。彼はバケツ全体をきれいにしています。私はちょうど特定のフォルダの底に定期的にファイルを削除したい。同時に私は削除をより速くしたいと思う。

私はあなたの提案とあなたの助けにお答えします。 1つのgsutilコマンドでこれを行うことはできますか?または別の方法?私はテストのために作成した

簡単なスクリプト(私は一時的に大量のファイルを削除するために用意しました。)

## step 1 - I pull the files together with the date format and save them to the file list1.txt. 
gsutil -m ls -la gs://mygooglecloudstorage/tmp/ | awk '{print $2,$3}' > /tmp/gsutil-tmp-files/list1.txt 


## step 2 - I filter the information saved in the file list1.txt. Based on the current date, I save the old dated files to file list2.txt. 
cat /tmp/gsutil-tmp-files/list1.txt | awk -F "T" '{print $1,$2,$3}' | awk '{print $1,$3}' | awk -F "#" '{print $1}' |grep -v `date +%F` |sort -bnr > /tmp/gsutil-tmp-files/list2.txt 


## step 3 - After the above process, I add the gsutil delete command to the first line and convert it into a shell script. 
cat /tmp/gsutil-tmp-files/list2.txt | awk '{$1 = "/root/google-cloud-sdk/bin/gsutil -m rm -r "; print}' > /tmp/gsutil-tmp-files/remove-old-files.sh 


## step 4 - I'm set the script permissions and delete old lists. 
chmod 755 /tmp/gsutil-tmp-files/remove-old-files.sh 
rm -rf /tmp/gsutil-tmp-files/list1.txt /tmp/gsutil-tmp-files/list2.txt 


## step 5 - I run the shell script and I destroy it after it is done. 
/bin/sh /tmp/gsutil-tmp-files/remove-old-files.sh 
rm -rf /tmp/gsutil-tmp-files/remove-old-files.sh 
+1

私はgcsfuseツールで私のバケットを装着することにより、この問題を解決しました。ローカルディスクのようにバケツを管理できるようになりました。しかし、ディスク上で多くの操作を実行するのはまだ遅いです。それでも、私はすぐにそれをクリアすることができます。 gcsfuseの詳細については、 https://cloud.google.com/storage/docs/gcs-fuse しかし、私はGoogleがこれらのニーズに自動解決策を必要としていると思います。 同様の問題を抱える人もこの方法を使用できます。私はこの点でより良い方法を持っている人々の新しいアイデアを公開しています。 – spala

答えて

2

今日のようにgsutilまたはオブジェクトのライフサイクル管理でこれを行うための簡単な方法がありません。

つまり、バケット内のオブジェクトの命名形式を変更することは可能でしょうか?つまり、 "gs:// mybucket/tmp /"の下にそれらをすべてアップロードする代わりに、そのプレフィックスに現在の日付を追加すると、 "gs:// mybucket/tmp/2017-12-27 /"のようになります。これの主な利点は次のとおりです。

  • すべてのオブジェクトについて日付比較を行う必要はありません。 gsutil ls "gs://mybucket/tmp/" | grep "gs://[^/]\+/tmp/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/$"を実行してこれらのプレフィックスを見つけ、それらのパスの最後の部分で日付比較を実行できます。
  • gsutil -m rm -rにコマンドライン上の引数の数を減らすことができます。したがって、シェルが処理できる引数よりも多くの引数を渡す可能性は低くなります。
+0

ご協力いただきありがとうございます。この方法は私が望むことをしません。私は回避策のソリューションを作成しました。私は上記の私のコメントで説明した。 – spala

0

は、たとえば、これを行うには非常に単純な方法があります:

gsutil -m ls -l gs://bucket-name/ | grep 2017-06-23 | grep .jpg | awk '{print $3}' | gsutil -m rm -I 
関連する問題