Aws-cli: aws s3 ls - temukan file berdasarkan tanggal modifikasi?

Dibuat pada 21 Jan 2015  ·  87Komentar  ·  Sumber: aws/aws-cli

Hai,
Kami ingin dapat menelusuri ember dengan ribuan (kemungkinan bertambah hingga ratusan ribu) objek dan folder/awalan untuk menemukan objek yang baru saja ditambahkan atau diperbarui. Menjalankan aws s3 ls di seluruh ember beberapa kali sehari dan kemudian menyortir daftar tampaknya tidak efisien. Apakah ada cara untuk meminta daftar objek dengan waktu yang dimodifikasi <, >, = stempel waktu tertentu?

Juga, apakah kami dikenakan biaya satu kali untuk permintaan aws s3 ls, atau satu kali untuk setiap objek yang dikembalikan oleh permintaan?

Baru mengenal github, semoga saya cukup tahu untuk menyumbangkan kode aktual ... hargai bantuannya.

guidance

Komentar yang paling membantu

@jwieder Ini tidak membantu pengguna mengurangi jumlah panggilan daftar ke s3. Katakanlah bahwa setiap hari Anda menyimpan ~1000 artikel berita dalam sebuah ember. Kemudian di sisi klien ingin mendapatkan artikel selama 3 hari terakhir secara default (dan lebih banyak lagi hanya jika diminta secara eksplisit). Harus mengambil daftar semua artikel sejak awal waktu, katakanlah 100rb, membutuhkan waktu dan menimbulkan biaya jaringan (karena satu panggilan daftar hanya akan mengembalikan hingga 1000 item). Akan jauh lebih baik untuk dapat mengatakan "Beri saya daftar item yang dibuat/dimodifikasi sejak 3 hari yang lalu".

Semua 87 komentar

API S3 tidak mendukung ini, jadi satu-satunya cara untuk melakukannya hanya dengan menggunakan S3 adalah dengan melakukan penyortiran sisi klien.

Sejauh harga S3 , kami menggunakan permintaan ListObjects yang mengembalikan 1000 objek sekaligus. Jadi, Anda akan dikenakan biaya untuk permintaan LIST per setiap 1000 objek saat menggunakan aws s3 ls .

Alternatif lain adalah menyimpan indeks bantu di luar S3, misalnya dynamodb. Beri tahu saya jika Anda memiliki pertanyaan lain.

Terima kasih

Meskipun fungsi ini tampaknya tetap absen dari aws-cli, cukup mudah untuk membuat skrip di bash. Sebagai contoh:

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

@jwieder Ini tidak membantu pengguna mengurangi jumlah panggilan daftar ke s3. Katakanlah bahwa setiap hari Anda menyimpan ~1000 artikel berita dalam sebuah ember. Kemudian di sisi klien ingin mendapatkan artikel selama 3 hari terakhir secara default (dan lebih banyak lagi hanya jika diminta secara eksplisit). Harus mengambil daftar semua artikel sejak awal waktu, katakanlah 100rb, membutuhkan waktu dan menimbulkan biaya jaringan (karena satu panggilan daftar hanya akan mengembalikan hingga 1000 item). Akan jauh lebih baik untuk dapat mengatakan "Beri saya daftar item yang dibuat/dimodifikasi sejak 3 hari yang lalu".

Tepat!

Pada Minggu, 17 Januari 2016 pukul 23.53, PuchatekwSzortach <
[email protected]> menulis:

@jwieder https://github.com/jwieder Ini tidak membantu penurunan pengguna
jumlah daftar panggilan ke s3. Katakan bahwa setiap hari Anda menyimpan ~1000 berita
artikel dalam ember. Kemudian di sisi klien ingin mendapatkan artikel untuk 3 terakhir
hari secara default (dan lebih banyak hanya jika diminta secara eksplisit). Harus mengambil a
daftar semua artikel sejak awal, katakan 100k, butuh waktu
dan menimbulkan biaya jaringan (karena satu panggilan daftar hanya akan kembali ke atas
menjadi 1000 item). Akan jauh lebih baik untuk dapat mengatakan "Beri saya daftar
item dibuat/dimodifikasi sejak 3 hari yang lalu".


Balas email ini secara langsung atau lihat di GitHub
https://github.com/aws/aws-cli/issues/1104#issuecomment -172425517.

@PuchatekwSzortach @ChrisSLT Anda benar, maaf atas jawaban saya yang lumpuh; dan saya setuju fungsi semacam ini akan sangat membantu di aws-cli. Kombinasi meninggalkan fitur dasar ini dan penagihan untuk daftar file sangat mencurigakan. Sampai AWS berhenti mencubit dan memperkenalkan daftar berdasarkan properti file, inilah ide lain yang saya gunakan yang lebih relevan dengan utas ini daripada jawaban pertama saya: Untuk file yang perlu dilacak dengan cara ini, file diberi nama dengan stempel waktu . Daftar file disimpan dalam file teks lokal (atau bisa berupa db jika Anda memiliki trilyunan file yang perlu dikhawatirkan). Mencari tanggal kemudian melibatkan membuka file, mencari nama file yang cocok dengan tanggal hari ini dapat terlihat seperti ini:

saat membaca -r fileName
melakukan
if [ "$namafile" == "$HARI INI" ]; kemudian
aws s3 sync $BUCKETURL /some/local/directory --exclude "*" --include "$fileName"
fi
selesai < "$FILE"

Di mana $FILE adalah indeks nama file lokal Anda dan $TODAY adalah tanggal yang Anda cari. Anda perlu mengubah kondisi pada loop ini, tetapi semoga ini dapat memberi Anda gambaran.

Melakukan hal-hal dengan cara ini membebaskan Anda dari segala biaya yang terkait dengan daftar file di ember Anda; tetapi itu juga tergantung pada klien yang Anda lakukan pencarian untuk memiliki akses ke daftar file lokal ... tergantung pada arsitektur aplikasi/sistem Anda yang mungkin membuat pendekatan semacam ini tidak layak. Bagaimanapun, semoga ini membantu dan sekali lagi mohon maaf atas jawaban derpy saya sebelumnya.

Setuju dan terima kasih

Pada Selasa, 19 Jan 2016 pukul 10:00, Josh Wieder [email protected]
menulis:

@PuchatekwSzortach https://github.com/PuchatekwSzortach @ChrisSLT
https://github.com/ChrisSLT Anda benar, maaf atas jawaban saya yang lumpuh; dan
Saya setuju fungsi semacam ini akan sangat membantu di aws-cli. NS
kombinasi meninggalkan fitur dasar ini dan penagihan untuk daftar file
sangat dicurigai. Sampai AWS berhenti mencubit dan memperkenalkan daftar oleh
properti file, inilah ide lain yang saya gunakan yang lebih relevan
ke utas ini maka balasan pertama saya: Untuk file yang perlu dilacak di ini
cara, file diberi nama dengan cap waktu. Daftar file disimpan di lokal
file teks (atau bisa jadi db jika Anda memiliki trilyunan file yang perlu dikhawatirkan).
Mencari tanggal kemudian melibatkan membuka file, mencari nama file
yang cocok dengan tanggal hari ini dapat terlihat seperti ini:

saat membaca -r fileName
melakukan
if [ "$namafile" == "$HARI INI" ]; kemudian
aws s3 sync $BUCKETURL /some/local/directory --exclude "*" --include
"$namafile"
fi
selesai < "$FILE"

Di mana $FILE adalah indeks nama file lokal Anda dan $TODAY adalah tanggal Anda berada
mencari. Anda harus mengubah kondisi pada loop ini, tapi
semoga ini bisa memberi gambaran.

Melakukan hal-hal dengan cara ini membebaskan Anda dari biaya apa pun yang terkait dengan daftar
file di ember Anda; tetapi itu juga tergantung pada klien yang Anda lakukan
pencarian untuk memiliki akses ke daftar file lokal ... tergantung pada Anda
arsitektur aplikasi / sistem yang mungkin membuat pendekatan semacam ini
tidak layak. Bagaimanapun, semoga ini membantu dan sekali lagi maaf untuk saya sebelumnya
jawaban derpi.


Balas email ini secara langsung atau lihat di GitHub
https://github.com/aws/aws-cli/issues/1104#issuecomment -172878454.

Ada cara untuk melakukan ini dengan fungsi s3api dan --query. Ini diuji pada OSX
aws s3api list-objects --bucket "bucket-name" --query 'Contents[?LastModified>= 2016-05-20 ][].{Key: Key}'
Anda kemudian dapat memfilter menggunakan jq atau grep untuk melakukan pemrosesan dengan fungsi s3api lainnya.

Sunting: tidak yakin mengapa mereka tidak muncul, tetapi Anda harus menggunakan backticks untuk mengelilingi tanggal yang Anda minta

Apakah mungkin bagi Anda untuk membuat folder untuk setiap hari dan dengan cara itu, Anda hanya akan mengakses file hari ini atau paling banyak folder kemarin untuk mendapatkan file terbaru.

Ya. Meskipun Anda mungkin merasa lebih mudah menggunakan awalan tanggal untuk kunci Anda (Anda tidak dapat menanyakan kombinasi nama-ember/nama folder menggunakan opsi --bucket). Menggunakan awalan tanggal akan memungkinkan Anda menggunakan tanda --prefix di cli dan mempercepat kueri Anda karena AWS merekomendasikan penggunaan angka atau hash di awal nama kunci untuk meningkatkan waktu respons.

@willstruebing , solusi Anda masih tidak mengurangi jumlah panggilan API S3, kompleksitas kueri sisi server, atau jumlah data yang dikirim melalui kabel. Parameter --query melakukan pemfilteran jmespath sisi klien saja.

@kislyuk Saya setuju sepenuhnya bahwa itu tidak menjawab masalah efisiensi. Namun, niat saya adalah untuk menjawab pertanyaan spesifik:

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

Pertanyaan mendasar itu adalah bagaimana saya berakhir di utas ini, jadi saya pikir masuk akal untuk memasukkan jawaban untuk itu. Masalah ini diberi label "aws s3 ls - temukan file berdasarkan tanggal modifikasi?".

Saya akan senang mendengar ide siapa pun tentang bagian efisiensi dari pertanyaan, karena saya sendiri tidak memilikinya dan saya masih penasaran.

#untuk saya di s3cmd ls | awk {'print $3'} ; lakukan aws s3 ls $i --recursive ; selesai >> s3-full.out

Apa default untuk file pengembalian AWS? Apakah itu mengembalikannya dalam urutan abjad, atau dengan modifikasi terbaru, atau apa kriteria yang digunakan ketika Anda meminta kumpulan 1000 nama file pertama Anda?

Saya setuju bahwa pasti harus ada semacam filter (urutkan berdasarkan tanggal, nama, dll) yang dapat Anda gunakan ketika Anda meminta file ... pasti fitur yang hilang. :(

Saya setuju pemfilteran ini harus di sisi server dan merupakan kebutuhan dasar.

+1 untuk kueri/pemfilteran sisi server

+1 untuk pemfilteran sisi server

Masih sangat dibutuhkan memang, +1

Setuju dengan @chescales dan yang lainnya, +1 ke pemfilteran sisi server

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

Bagaimana ini bukan fitur?

+100000

+1e999

+1

+1

+1

+1

+1

+1

+1

+1

+65535

Komentar @willstruebing bekerja untuk saya, misalnya:

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

oh tidak apa-apa - Saya melihat setelah melihat lalu lintas jaringan dari perintah ini bahwa semua kunci masih diunduh dari s3 dan aws cli melakukan penyaringan sisi klien!

+1

+1

+1

+1

bagaimana dengan --exclude dan --include filter?

!/bin/bash

TANGGAL=$(tanggal +%Y-%m-%d)
aws s3 ls s3://bucket.example.com/somefolder/ --exclude " " --include " ${DATE}*"

+1

+1

+1 juta

+1

+∞

+∞+1

+1

+1

+1

++

+1

+1

+1

+1 :(

Saya pikir itu adalah bagian dari model penetapan harga AWS, penyimpanan super murah tetapi membayar untuk mengakses. Bagus untuk file besar tetapi akan merusak Anda jika Anda ingin meminta/mengelola jutaan file kecil.

+1

saya kira ini adalah mengapa mereka menciptakan athena? cara lain untuk menagih sambil menambahkan beberapa lonceng dan peluit?

+1

+1

+1

saya harus membuat daftar objek ember s3 yang dimodifikasi di antara dua tanggal ex. 08-06-2019 hingga 11-06-2019

ada ide siapa?

aws s3api list-objects --bucket "BUCKET" --prefix "OPTIONAL" --query "Contents[?LastModified>='2019-06-08'][].{Key: Key,LastModified: LastModified}" lalu gunakan JQ atau alat pilihan Anda untuk menyaring setelah 11-06-2019

Itu tidak menghilangkan panggilan API. Pertanyaan-pertanyaan itu adalah sisi klien

Pada Selasa, 11 Juni 2019, 14:07 willstruebing [email protected]
menulis:

aws s3api list-objects --bucket "BUCKET" --prefix "OPTIONAL" --query
"Contents[?LastModified>='2019-06-08'][].{Key: Key,LastModified:
LastModified}" lalu gunakan JQ atau alat pilihan Anda untuk menyaring setelahnya
2019-06-11


Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/aws/aws-cli/issues/1104?email_source=notifications&email_token=AABLGMW5AFAU5BUNM7FEMZ3PZ7SV3A5CNFSM4A2VNZ2KYY3PNVWWK3TUL52HS4DFVREXG43VMVBWJKLOOR5CNFSM4A2VNZ2KYY3PNVWWK3TUL52HS4DFVREXG43VMVBWJKLODOR5CYWZJKLODNALNMVXH03issue
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AABLGMVTIZDPPIEUK2CZR6TPZ7SV3ANCNFSM4A2VNZ2A
.

@dmead saya setuju sepenuhnya. Namun, fungsionalitas untuk melakukan pemfilteran sisi server saat ini tidak ada (saya pikir itu sebabnya begitu banyak orang berakhir di pos khusus ini), jadi ini adalah satu-satunya solusi yang saya tahu untuk menyelesaikan tugas yang ada. Apakah Anda memiliki cara untuk melakukannya di sisi server atau ini hanya pengamatan tentang solusi yang diusulkan? Saya ingin mendengar masukan tentang cara melakukannya DAN mengurangi jumlah panggilan API.

Jika Anda punya waktu, saya akan memilih metadata di athena. Saya
belum punya kesempatan sendiri, tapi itu sepertinya solusi yang mungkin.

Pada hari Rabu, 12 Jun 2019 jam 10:28 pagi willstruebing [email protected]
menulis:

@dmead https://github.com/dmead Saya setuju sepenuhnya. Namun,
fungsionalitas untuk melakukan pemfilteran sisi server saat ini tidak ada (saya pikir
itulah mengapa begitu banyak orang berakhir di pos khusus ini), jadi ini adalah
hanya solusi yang saya tahu untuk menyelesaikan tugas yang ada. Apakah Anda memiliki
cara melakukannya di sisi server atau ini hanya pengamatan tentang yang diusulkan
larutan? Saya ingin mendengar masukan tentang cara melakukannya DAN mengurangi jumlah
panggilan API.


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/aws/aws-cli/issues/1104?email_source=notifications&email_token=AABLGMTQZD6OWVH4KDMSJPLP2EBY7A5CNFSM4A2VNZ2KYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WSY27
atau matikan utasnya
https://github.com/notifications/unsubscribe-auth/AABLGMRLA5OYSYGEYNPUY5DP2EBY7ANCNFSM4A2VNZ2A
.

+24

Semua orang mendukung ini, mengajukannya dengan AWS CLI tidak membantu. AWS CLI terikat oleh S3. File dengan tim S3 daripada github alat jika Anda ingin memperbaikinya: P

@ mike-bailey OK, dan bagaimana saya melakukannya?

Jika saya pribadi, saya akan mengajukan tiket AWS sehingga sampai ke tim layanan. Tapi saya tidak bekerja untuk AWS. Saya hanya tahu mengomentari '+1' pada ini tidak akan menjadi perubahan.

Ada cara untuk melakukan ini dengan fungsi s3api dan --query. Ini diuji pada OSX
aws s3api list-objects --bucket "bucket-name" --query 'Contents[?LastModified>= 2016-05-20 ][].{Key: Key}'
Anda kemudian dapat memfilter menggunakan jq atau grep untuk melakukan pemrosesan dengan fungsi s3api lainnya.

Sunting: tidak yakin mengapa mereka tidak muncul, tetapi Anda harus menggunakan backticks untuk mengelilingi tanggal yang Anda minta

Pastikan Anda memiliki awscli versi terbaru sebelum mencoba jawaban ini. saya meningkatkan
awscli 1.11.47 -> 1.16.220
dan itu melakukan penyaringan sisi klien yang ditakuti tetapi berhasil.
+1 untuk pemfilteran sisi server.

+1

+1

Silakan baca utasnya, +1 tidak melakukan apa-apa

Anda tidak dapat melakukan ini dengan mudah tetapi terkubur dalam komentar ini adalah tip berikut:

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

Ini masih sisi klien dan akan melakukan banyak permintaan.

Seperti disebutkan sebelumnya, ia menanganinya dari sisi klien. Jadi Anda masih berpotensi membanting ember dengan panggilan.

Pemfilteran harus di sisi server dan menurut saya merupakan kebutuhan dasar.

Berikut adalah contoh menggunakan sinkronisasi aws s3 sehingga hanya file baru yang diunduh. Ini menggabungkan log menjadi satu file log dan menghapus komentar sebelum menyimpan file. Anda kemudian dapat menggunakan grep dan berbagai hal untuk mendapatkan data log. Dalam kasus saya, saya perlu menghitung klik unik ke file tertentu. Kode di bawah ini diadaptasi dari tautan ini: https://shapeshed.com/aws-cloudfront-log/ Perintah sed juga berfungsi di Mac dan berbeda dari yang ada di artikel. Semoga ini membantu!

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

Saya tahu ini masalah lama tetapi meninggalkan solusi yang elegan di sini:

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat