Aws-cli: aws s3 ls - البحث عن الملفات حسب تاريخ التعديل؟

تم إنشاؤها على ٢١ يناير ٢٠١٥  ·  87تعليقات  ·  مصدر: aws/aws-cli

أهلا،
نود أن نكون قادرين على البحث في حاوية تحتوي على عدة آلاف (من المحتمل أن تنمو إلى مئات الآلاف) من الكائنات والمجلدات / البادئات للعثور على الكائنات التي تمت إضافتها أو تحديثها مؤخرًا. يبدو أن تنفيذ aws s3 ls على الحاوية بأكملها عدة مرات في اليوم ثم الفرز عبر القائمة يبدو غير فعال. هل هناك طريقة لطلب قائمة كائنات بوقت مُعدَّل <،> ، = طابع زمني معين؟

أيضًا ، هل يتم تحصيل رسوم مقابل طلب aws s3 ls مرة واحدة أم مرة واحدة لكل عنصر يتم إرجاعه بواسطة الطلب؟

جديد في جيثب ، أتمنى لو كنت أعرف ما يكفي للمساهمة في الكود الفعلي ... أقدر المساعدة.

guidance

التعليق الأكثر فائدة

jwieder لا يساعد هذا المستخدم في تقليل عدد مكالمات القائمة إلى s3. لنفترض أنك تخزن كل يوم حوالي 1000 مقال إخباري في دلو. ثم من جانب العميل ، ترغب في الحصول على مقالات لآخر 3 أيام بشكل افتراضي (والمزيد فقط إذا طلب ذلك صراحة). إن الاضطرار إلى إحضار قائمة بجميع المقالات منذ بداية الوقت ، على سبيل المثال 100 ألف ، يستغرق وقتًا ويتراكم تكاليف الشبكة (لأن استدعاء قائمة واحدة سيعود فقط ما يصل إلى 1000 عنصر). سيكون من الأجمل بكثير أن تكون قادرًا على قول "أعطني قائمة بالعناصر التي تم إنشاؤها / تعديلها منذ 3 أيام".

ال 87 كومينتر

لا تدعم واجهة S3 API هذا الأمر ، لذا فإن الطريقة الوحيدة للقيام بذلك باستخدام S3 هي إجراء الفرز من جانب العميل.

بقدر ما يتم تسعير S3 ، نستخدم طلب ListObjects الذي يُرجع 1000 عنصر في المرة الواحدة. لذلك ستتم محاسبتك على طلب LIST لكل 1000 عنصر عند استخدام aws s3 ls .

بديل آخر هو تخزين فهرس إضافي خارج S3 ، على سبيل المثال dynamodb. اسمحوا لي أن أعرف إذا كان لديك أي أسئلة أخرى.

شكرا لك

على الرغم من أن هذه الوظيفة تبدو غائبة عن aws-cli ، إلا أنه من السهل جدًا كتابتها في bash. على سبيل المثال:

#!/bin/bash
DATE=$(date +%Y-%m-%d)
aws s3 ls s3://bucket.example.com/somefolder/ | grep ${DATE}

jwieder لا يساعد هذا المستخدم في تقليل عدد مكالمات القائمة إلى s3. لنفترض أنك تخزن كل يوم حوالي 1000 مقال إخباري في دلو. ثم من جانب العميل ، ترغب في الحصول على مقالات لآخر 3 أيام بشكل افتراضي (والمزيد فقط إذا طلب ذلك صراحة). إن الاضطرار إلى إحضار قائمة بجميع المقالات منذ بداية الوقت ، على سبيل المثال 100 ألف ، يستغرق وقتًا ويتراكم تكاليف الشبكة (لأن استدعاء قائمة واحدة سيعود فقط ما يصل إلى 1000 عنصر). سيكون من الأجمل بكثير أن تكون قادرًا على قول "أعطني قائمة بالعناصر التي تم إنشاؤها / تعديلها منذ 3 أيام".

بالضبط!

يوم الأحد 17 كانون الثاني (يناير) 2016 الساعة 11:53 مساءً ، PuchatekwSzortach <
[email protected]> كتب:

jwieder https://github.com/jwieder هذا لا يساعد المستخدم في تقليل
عدد مكالمات القائمة إلى s3. قل أنك تخزن كل يوم حوالي 1000 خبر
مقالات في دلو. ثم على جانب العميل تريد الحصول على مقالات لآخر 3
أيام بشكل افتراضي (وأكثر فقط إذا طلب ذلك صراحة). الحاجة إلى إحضار ملف
قائمة بجميع المقالات منذ بداية الوقت ، ولنقل 100 ألف ، تستغرق وقتًا
وتراكم تكاليف الشبكة (لأن استدعاء قائمة واحدة سيعود فقط لأعلى
إلى 1000 عنصر). سيكون من الأجمل أن تكون قادرًا على قول "أعطني قائمة
من العناصر التي تم إنشاؤها / تعديلها منذ 3 أيام مضت ".

-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/aws/aws-cli/issues/1104#issuecomment -172425517.

PuchatekwSzortachChrisSLT أنت على حق ، آسف لردتي الأعرج ؛ وأنا أوافق على أن هذا النوع من الوظائف سيكون مفيدًا جدًا في aws-cli. إن الجمع بين ترك هذه الميزة الأساسية وفوترة قوائم الملفات أمر مشكوك فيه للغاية. إلى أن تتوقف AWS عن الضغط على أجر ضئيل وتقدم قائمة حسب خصائص الملف ، فإليك فكرة أخرى استخدمتها أكثر صلة بمؤشر الترابط هذا ثم إجابتي الأولى: بالنسبة للملفات التي تحتاج إلى التعقب بهذه الطريقة ، تتم تسمية الملفات بطابع زمني . يتم تخزين قائمة الملفات في ملف نصي محلي (أو يمكن أن تكون ديسيبل إذا كان لديك عدد كبير من الملفات التي تقلق بشأنها). البحث عن تاريخ يتضمن فتح الملف ، والبحث عن أسماء الملفات التي تتطابق مع تاريخ اليوم قد تبدو كما يلي:

أثناء قراءة -r fileName
فعل
إذا كان ["$ fileName" == "$ TODAY"] ؛ من ثم
aws s3 sync $ BUCKETURL / some / local / directory - استبعاد "*" - يتضمن "$ fileName"
فاي
تم <"$ FILE"

حيث $ FILE هو فهرس اسم الملف المحلي الخاص بك و $ TODAY هو التاريخ الذي تبحث عنه. ستحتاج إلى تغيير الشرط في هذه الحلقة ، ولكن نأمل أن يعطيك هذا فكرة.

يؤدي القيام بالأشياء بهذه الطريقة إلى إعفائك من أي رسوم متعلقة بإدراج الملفات في مجموعتك ؛ ولكنه يعتمد أيضًا على العميل الذي تُجري البحث عن الوصول إلى قائمة الملفات المحلية ... اعتمادًا على بنية التطبيق / النظام الذي قد يجعل هذا النوع من النهج غير ممكن. على أي حال ، آمل أن يكون هذا مفيدًا وأعتذر مرة أخرى عن رد ديربي السابق.

متفق عليه وشكرا

يوم الثلاثاء ، 19 كانون الثاني (يناير) 2016 ، الساعة 10:00 صباحًا ، Josh Wieder [email protected]
كتب:

PuchatekwSzortach https://github.com/PuchatekwSzortach ChrisSLT
https://github.com/ChrisSLT أنت على حق ، آسف لردتي الأعرج ؛ و
أوافق على أن هذا النوع من الوظائف سيكون مفيدًا جدًا في aws-cli. ال
مزيج من ترك هذه الميزة الأساسية خارج وإعداد الفواتير لقوائم الملفات
مشكوك فيه للغاية. حتى تتوقف AWS عن إقحام العملات وتقوم بتقديم قائمة بواسطة
خصائص الملف ، ها هي فكرة أخرى استخدمتها أكثر صلة
إلى هذا الموضوع ثم ردي الأول: للملفات التي تحتاج إلى تعقب في هذا
الطريقة ، تتم تسمية الملفات بطابع زمني. يتم تخزين قائمة الملفات في محلي
ملف نصي (أو يمكن أن يكون ديسيبل إذا كان لديك عدد كبير من الملفات التي تقلق بشأنها).
البحث عن تاريخ يتضمن فتح الملف والبحث عن أسماء الملفات
التي تتطابق مع تاريخ اليوم قد تبدو كالتالي:

أثناء قراءة -r fileName
فعل
إذا كان ["$ fileName" == "$ TODAY"] ؛ من ثم
aws s3 sync $ BUCKETURL / some / local / directory - استبعاد "*" - يتضمن
"$ fileName"
فاي
تم <"$ FILE"

حيث $ FILE هو فهرس اسم الملف المحلي الخاص بك و $ TODAY هو التاريخ الذي أنت فيه
البحث عن. ستحتاج إلى تغيير الشرط في هذه الحلقة ، لكن
نأمل أن يعطيك هذا فكرة.

يؤدي القيام بالأشياء بهذه الطريقة إلى إعفائك من أي رسوم متعلقة بإدراج ملف
الملفات في دلو الخاص بك ؛ ولكنه يعتمد أيضًا على العميل الذي تديره
البحث عن الوصول إلى قائمة الملفات المحلية ... اعتمادًا على ملف
بنية التطبيق / النظام التي قد تجعل هذا النوع من النهج
غير ممكن. على أي حال ، أتمنى أن يساعدك هذا وأعتذر مرة أخرى عني السابق
رد derpy.

-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/aws/aws-cli/issues/1104#issuecomment -172878454.

توجد طريقة للقيام بذلك باستخدام دالة s3api و --query. تم اختبار هذا على OSX
aws s3api list-object --bucket "bucket-name" --query 'Contents [؟ LastModified> = 2016-05-20 ] []. {Key: Key}'
يمكنك بعد ذلك التصفية باستخدام jq أو grep لإجراء المعالجة مع وظائف s3api الأخرى.

تحرير: لست متأكدًا من سبب عدم ظهورها ، ولكن عليك استخدام backticks لإحاطة التاريخ الذي تقوم بالاستعلام عنه

هل من الممكن بالنسبة لك إنشاء مجلدات لكل يوم وبهذه الطريقة ، ستتمكن من الوصول إلى ملفات اليوم فقط أو في معظم مجلدات الأمس للحصول على أحدث الملفات.

نعم فعلا. على الرغم من أنك قد تجد أنه من الأسهل ببساطة استخدام بادئة تاريخ للمفاتيح الخاصة بك (لا يمكنك الاستعلام عن تركيبة اسم المستودع / اسم المجلد باستخدام الخيار --bucket). سيسمح لك استخدام بادئة التاريخ باستخدام علامة --prefix في cli وتسريع استفساراتك حيث توصي AWS باستخدام الأرقام أو التجزئة في بداية أسماء المفاتيح لزيادة أوقات الاستجابة.

willstruebing ، لا يزال الحل الخاص بك لا يقلل من عدد استدعاءات S3 API أو تعقيد الاستعلام من جانب الخادم أو مقدار البيانات المرسلة عبر السلك. تقوم المعلمة --query بتصفية jmespath من جانب العميل فقط.

kislyuk أوافق تمامًا على أن هذا لا يجيب على قضايا الكفاءة. ومع ذلك ، كنت أنوي الإجابة على السؤال المحدد:

Is there a way to simply request a list of objects with a modified time <, >, = a certain timestamp?

هذا السؤال الأساسي هو كيف انتهى بي الأمر في هذا الموضوع ، ولذا اعتقدت أنه من المعقول تضمين إجابة عليه. تم تصنيف المشكلة باسم "aws s3 ls - هل تبحث عن الملفات حسب تاريخ التعديل؟".

أرغب في سماع أفكار أي شخص حول أجزاء الكفاءة في السؤال ، حيث لا أمتلك واحدة بنفسي وما زلت أشعر بالفضول.

# لأني في s3cmd ls | awk {'print $3'} ؛ قم بعمل aws s3 ls $ i - متسلسل ؛ تم >> s3-full.out

ما هو الإعداد الافتراضي لملفات AWS المرتجعة؟ هل يعيدها بترتيب أبجدي ، أو بأحدث تعديل ، أو ما هي المعايير المستخدمة عندما تطلب دفعتك الأولى المكونة من 1000 اسم ملف؟

أوافق على أنه يجب أن يكون هناك بالتأكيد نوع من المرشحات (الفرز حسب التاريخ ، بالاسم ، etct) التي يمكنك استخدامها عند طلب الملفات ... بالتأكيد ميزة مفقودة. :(

أوافق على أن تكون هذه التصفية من جانب الخادم وهي حاجة أساسية.

+1 للاستعلام / التصفية من جانب الخادم

+1 لتصفية جانب الخادم

لا تزال هناك حاجة ماسة بالفعل ، +1

تم الاتفاق مع chescales والباقي ، +1 للتصفية من جانب الخادم

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

كيف هذه ليست ميزة بالفعل؟

+100000

+1e999

+1

+1

+1

+1

+1

+1

+1

+1

+65535

نجح تعليق

aws s3api list-objects --bucket "mybucket" --prefix "some/prefix" --query "Contents[?LastModified>=`2018-08-22`].{Key: Key}"

لا داعي للقلق - أرى بعد مشاهدة حركة مرور الشبكة من هذا الأمر أن جميع المفاتيح لا تزال قيد التنزيل من s3 وأن aws cli يقوم بتصفية جانب العميل!

+1

+1

+1

+1

ماذا عن - استبعاد و - تشمل المرشحات؟

! / بن / باش

التاريخ = $ (التاريخ +٪ Y-٪ m-٪ d)
aws s3 ls s3: //bucket.example.com/somefolder/ --exclude " " - تتضمن " $ {DATE} *"

+1

+1

+1 مليون

+1

+ ∞

+ ∞ + 1

+1

+1

+1

++

+1

+1

+1

+1 :(

أعتقد أن هذا جزء من نموذج التسعير الخاص بـ AWS ، التخزين الفائق الرخيص ولكن الدفع مقابل الوصول إليه. جيد للملفات الكبيرة ولكنه سوف يفسدك إذا كنت تريد الاستعلام / إدارة ملايين الملفات الصغيرة.

+1

أعتقد أن هذا هو سبب إنشاء أثينا؟ طريقة أخرى للفاتورة مع إضافة بعض الأجراس والصفارات؟

+1

+1

+1

لا بد لي من سرد كائنات حاوية s3 التي تم تعديلها بين تاريخين على سبيل المثال. 2019-06-08 to 2019-06-11

اي فكرة اي احد؟

aws s3api list-objects --bucket "BUCKET" --prefix "OPTIONAL" --query "Contents[?LastModified>='2019-06-08'][].{Key: Key,LastModified: LastModified}" ثم استخدم JQ أو أداتك المفضلة للتصفية بعد 2019-06-11

هذا لا يلغي استدعاءات API. هذه الاستفسارات هي جانب العملاء

في الثلاثاء 11 يونيو 2019 الساعة 2:07 ظهرًا willstruebing [email protected]
كتب:

قائمة كائنات aws s3api - حزمة "BUCKET" - رمز "اختياري" - استعلام
"المحتويات [؟ LastModified> = '2019-06-08'] []. {Key: Key، LastModified:
LastModified} "ثم استخدم JQ أو الأداة المفضلة لديك للتصفية بعد ذلك
2019-06-11

-
أنت تتلقى هذا لأنك علقت.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/aws/aws-cli/issues/1104؟
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AABLGMVTIZDPPIEUK2CZR6TPZ7SV3ANCNFSM4A2VNZ2A
.

@ dmead أوافق تمامًا. ومع ذلك ، فإن وظيفة إجراء التصفية من جانب الخادم غير موجودة حاليًا (أعتقد أن هذا هو السبب في أن الكثير من الأشخاص ينتهي بهم الأمر في هذا المنشور المحدد) ، لذلك هذا هو الحل الوحيد الذي أعرفه لإكمال المهمة المطروحة. هل لديك طريقة للقيام بذلك من جانب الخادم أم أن هذه مجرد ملاحظة حول الحل المقترح؟ أود أن أسمع مدخلات حول كيفية القيام بذلك وتقليل عدد استدعاءات واجهة برمجة التطبيقات.

إذا كان لديك الوقت ، فسأبحث في تحديد البيانات الوصفية في أثينا. أنا
لم تتح لي الفرصة بنفسي ، لكن هذا بدا وكأنه حل ممكن.

يوم الأربعاء 12 يونيو 2019 الساعة 10:28 صباحًا willstruebing [email protected]
كتب:

dmead https://github.com/dmead أوافق تمامًا. ومع ذلك ، فإن
لا توجد حاليًا وظيفة للقيام بالتصفية من جانب الخادم (على ما أعتقد
لهذا السبب ينتهي الأمر بالعديد من الأشخاص في هذا المنشور المحدد) ، لذلك هذا هو
الحل الوحيد الذي أعرفه لإكمال المهمة المطروحة. هل لديك
طريقة للقيام بذلك من جانب الخادم أم أن هذه مجرد ملاحظة حول المقترح
المحلول؟ أود أن أسمع مدخلات حول كيفية القيام بذلك وتقليل كمية
مكالمات API.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/aws/aws-cli/issues/1104؟
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AABLGMRLA5OYSYGEYNPUY5DP2EBY7ANCNFSM4A2VNZ2A
.

+24

كل شخص يؤيد هذا ، وتقديمه باستخدام AWS CLI لا يساعد. AWS CLI ملزم بـ S3. ملف مع فريق S3 بدلاً من جيثب الأداة إذا كنت تريد إصلاحه: P

@ mike-bailey حسنًا ، وكيف أفعل ذلك؟

إذا كنت أنا شخصياً ، كنت سأقدم تذكرة AWS حتى تصل إلى فريق الخدمة. لكني لا أعمل لدى AWS. أنا أعرف فقط أن التعليق "+1" على هذا لن يكون التغيير.

توجد طريقة للقيام بذلك باستخدام دالة s3api و --query. تم اختبار هذا على OSX
aws s3api list-object --bucket "bucket-name" --query 'Contents [؟ LastModified> = 2016-05-20 ] []. {Key: Key}'
يمكنك بعد ذلك التصفية باستخدام jq أو grep لإجراء المعالجة مع وظائف s3api الأخرى.

تحرير: لست متأكدًا من سبب عدم ظهورها ، ولكن عليك استخدام backticks لإحاطة التاريخ الذي تقوم بالاستعلام عنه

تأكد من أن لديك أحدث إصدار من awscli قبل تجربة هذه الإجابة. قمت بالترقية
awscli 1.11.47 -> 1.16.220
وفعلت التصفية المخيفة من جانب العميل لكنها نجحت.
+1 للتصفية من جانب الخادم.

+1

+1

يرجى قراءة الموضوع ، +1 لا تفعل أي شيء

لا يمكنك القيام بذلك بسهولة ولكن مدفونة في هذه التعليقات هي النصيحة التالية:

 aws s3api list-objects --bucket "bucket-name" --query 'Contents[?LastModified>=`2016-05-20`][].{Key: Key}'

لا يزال هذا جانب العميل وسيؤدي الكثير من الطلبات.

كما لوحظ سابقًا ، فإنه يتعامل مع جانب العميل. لذلك لا يزال من المحتمل أن تغلق الدلو بالمكالمات.

يجب أن تكون التصفية من جانب الخادم وهي حاجة أساسية على ما أعتقد.

فيما يلي مثال على استخدام مزامنة aws s3 بحيث يتم تنزيل الملفات الجديدة فقط. فهو يجمع بين السجلات في ملف سجل واحد ويقوم بتقطيع التعليقات قبل حفظ الملف. يمكنك بعد ذلك استخدام grep والأشياء للحصول على بيانات السجل. في حالتي ، كنت بحاجة إلى حساب عدد مرات الوصول الفريدة إلى ملف معين. تم تعديل هذا الرمز أدناه من هذا الرابط: https://shapeshed.com/aws-cloudfront-log/ يعمل الأمر sed على نظام Mac أيضًا وهو مختلف عن ما هو موجود في المقالة. أتمنى أن يساعدك هذا!

aws s3 sync s3://<YOUR_BUCKET> .
cat *.gz > combined.log.gz
gzip -d combined.log.gz
sed -i '' '/^#/ d' combined.log

# counts unique logs for px.gif hits
grep '/px.gif' combined.log | cut -f 1,8 | sort | uniq -c | sort -n -r

# above command will return something like below. The total count followed by the date and the file name.
17 2020-01-02 /px.gif
 9 2020-01-03 /px.gif

أعلم أنها مشكلة قديمة ولكن لأترك حلاً أنيقًا هنا:

aws s3api list-object --output = text --query "Contents [؟ LastModified> = <DATE_YOU_WANT_TO_START> ]. {Key: Key}"

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات