2017-12-07 3 views
1

Ich habe einen Eimer in Google Cloud-Speicher. Ich habe einen tmp-Ordner im Eimer. In diesem Verzeichnis werden jeden Tag Tausende von Dateien erstellt. Ich möchte jede Nacht Dateien löschen, die älter als 1 Tag sind. Ich konnte keinen Streit über gsutil für diesen Job finden. Ich musste dafür ein klassisches und einfaches Shell-Skript verwenden. Aber die Dateien löschen sehr langsam.gsutil Befehl zum Löschen alter Dateien vom letzten Tag

Ich habe 650K Dateien im Ordner angesammelt. 540K davon müssen gelöscht werden. Aber mein eigenes Shell-Skript funktionierte für 1 Tag und nur 34K-Dateien konnten gelöscht werden.

Die gsutil Lifecycle-Funktion ist nicht in der Lage, genau das zu tun, was ich will. Er putzt den ganzen Eimer. Ich möchte nur die Dateien regelmäßig am unteren Rand eines bestimmten Ordners löschen. Gleichzeitig möchte ich das Löschen schneller machen.

Ich bin offen für Ihre Vorschläge und Ihre Hilfe. Kann ich das mit einem einzigen Befehl gsutil machen? oder eine andere Methode?

einfaches Skript, das ich für die Prüfung erstellt (I vorbereitet Bulk-Dateien vorübergehend zu löschen.)

## 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

ich dieses Problem gelöst, indem mein Eimer mit gcsfuse Werkzeugmontage. Jetzt kann ich meinen Bucket wie eine lokale Festplatte verwalten. Aber es ist immer noch langsam, viele Operationen auf der Platte durchzuführen. Trotzdem kann ich es jetzt schnell klären. Für detaillierte Informationen über gcsfuse; https://cloud.google.com/storage/docs/gcs-fuse Aber ich denke, dass Google eine automatische Lösung für diese Bedürfnisse braucht. Diejenigen, die ähnliche Probleme haben, können diese Methode verwenden. Ich bin offen für neue Ideen derjenigen, die in dieser Hinsicht eine bessere Methode haben. – spala

Antwort

2

Es gibt keine einfache Möglichkeit, dies mit gsutil oder Objekt-Lifecycle-Management von heute zu tun.

Wäre es für Sie möglich, das Benennungsformat für die Objekte in Ihrem Bucket zu ändern? Das heißt, anstatt sie alle unter "gs: // mybucket/tmp /" hochzuladen, könnten Sie das aktuelle Datum an dieses Präfix anhängen, was zu etwas wie "gs: // mybucket/tmp/2017-12-27 /" führt. . Die wichtigsten Vorteile wären:

  • Sie müssen für jedes Objekt keinen Datumsvergleich durchführen; Sie könnten gsutil ls "gs://mybucket/tmp/" | grep "gs://[^/]\+/tmp/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/$" ausführen, um diese Präfixe zu finden, und dann auf dem letzten Teil dieser Pfade Datumsvergleiche durchführen.
  • Die Möglichkeit, eine geringere Anzahl an Argumenten in der Befehlszeile (Präfixe als den Namen jeder einzelnen Datei) an gsutil -m rm -r zu übergeben, wodurch weniger Argumente übergeben werden, als Ihre Shell verarbeiten kann.
+0

Vielen Dank für Ihre Unterstützung. Diese Methode macht nicht was ich will. Ich habe eine Umgehungslösung erstellt. Ich erklärte in meinem Kommentar oben. – spala

0

Es ist eine sehr einfache Möglichkeit, dies zu tun, zum Beispiel:

gsutil -m ls -l gs://bucket-name/ | grep 2017-06-23 | grep .jpg | awk '{print $3}' | gsutil -m rm -I 
Verwandte Themen