ถ้าฉันไม่มีอะไรหายไปดูเหมือนว่าไม่มี API ใดที่ฉันได้ดูจะบอกคุณว่ามีวัตถุจำนวนเท่าใดใน S3 bucket / โฟลเดอร์ (คำนำหน้า) มีวิธีใดบ้างที่จะได้รับการนับ?
ถ้าฉันไม่มีอะไรหายไปดูเหมือนว่าไม่มี API ใดที่ฉันได้ดูจะบอกคุณว่ามีวัตถุจำนวนเท่าใดใน S3 bucket / โฟลเดอร์ (คำนำหน้า) มีวิธีใดบ้างที่จะได้รับการนับ?
คำตอบ:
ไม่มีทางเว้นแต่คุณ
แสดงรายการทั้งหมดในแบตช์ 1,000 (ซึ่งอาจช้าและดูดแบนด์วิดท์ - ดูเหมือนว่า amazon จะไม่บีบอัดการตอบสนอง XML) หรือ
เข้าสู่ระบบบัญชีของคุณใน S3 และไปที่บัญชี - การใช้งาน ดูเหมือนว่าแผนกการเรียกเก็บเงินรู้จำนวนวัตถุที่คุณเก็บไว้อย่างแน่นอน!
เพียงแค่ดาวน์โหลดรายการของวัตถุทั้งหมดของคุณจริง ๆ แล้วจะใช้เวลาและค่าใช้จ่ายเงินถ้าคุณมี 50 ล้านวัตถุที่เก็บไว้
ดูหัวข้อนี้เกี่ยวกับ StorageObjectCountซึ่งอยู่ในข้อมูลการใช้งาน
S3 API เพื่อให้ได้พื้นฐานอย่างน้อยแม้ว่าจะเป็นชั่วโมงมันก็ยอดเยี่ยม
aws s3 ls s3://mybucket/ --recursive | wc -l
หรือ
aws cloudwatch get-metric-statistics \
--namespace AWS/S3 --metric-name NumberOfObjects \
--dimensions Name=BucketName,Value=BUCKETNAME \
Name=StorageType,Value=AllStorageTypes \
--start-time 2016-11-05T00:00 --end-time 2016-11-05T00:10 \
--period 60 --statistic Average
หมายเหตุ: คำสั่ง cloudwatch ข้างต้นดูเหมือนว่าจะทำงานสำหรับบางคนในขณะที่ไม่ได้สำหรับคนอื่น ๆ พูดคุยที่นี่: https://forums.aws.amazon.com/thread.jspa?threadID=217050
คุณสามารถดูส่วนการวัดของ cloudwatchเพื่อรับจำนวนวัตถุที่จัดเก็บโดยประมาณ
ฉันมีผลิตภัณฑ์ประมาณ 50 ล้านชิ้นและใช้เวลามากกว่าหนึ่งชั่วโมงในการนับ aws s3 ls
aws s3 ls s3://mybucket/mydirectory/ --recursive | wc -l
มี--summarize
สวิตช์ซึ่งมีข้อมูลสรุปของที่เก็บข้อมูล (เช่นจำนวนวัตถุขนาดรวม)
นี่คือคำตอบที่ถูกต้องโดยใช้ AWS cli:
aws s3 ls s3://bucketName/path/ --recursive --summarize | grep "Total Objects:"
Total Objects: 194273
Total Objects: 7235
Total Size: 475566411749
- ง่ายมาก
แม้ว่านี่จะเป็นคำถามเก่าและข้อเสนอแนะถูกให้ในปี 2015 ตอนนี้มันง่ายกว่ามากเนื่องจาก S3 Web Console ได้เปิดใช้งานตัวเลือก "รับขนาด":
ซึ่งให้บริการดังต่อไปนี้:
หากคุณใช้เครื่องมือบรรทัดคำสั่งs3cmdคุณสามารถรับรายชื่อ recursive ของที่ฝากข้อมูลเฉพาะแล้วส่งออกไปยังไฟล์ข้อความ
s3cmd ls -r s3://logs.mybucket/subfolder/ > listing.txt
จากนั้นใน linux คุณสามารถเรียกใช้ wc -l บนไฟล์เพื่อนับบรรทัด (1 บรรทัดต่อวัตถุ)
wc -l listing.txt
-r
ในคำสั่งสำหรับ--recursive
ดังนั้นจึงควรทำงานสำหรับโฟลเดอร์ย่อยได้เป็นอย่างดี
aws s3 ls
มากกว่า s3cmd เพราะเร็วกว่า b.) สำหรับถังขนาดใหญ่อาจใช้เวลานาน ใช้เวลาประมาณ 5 นาทีสำหรับไฟล์ 1mil c.) ดูคำตอบของฉันด้านล่างเกี่ยวกับการใช้ cloudwatch
มีวิธีแก้ปัญหาง่าย ๆ กับ S3 API ตอนนี้ (มีให้ใน AWS cli):
aws s3api list-objects --bucket BUCKETNAME --output json --query "[length(Contents[])]"
หรือสำหรับโฟลเดอร์เฉพาะ:
aws s3api list-objects --bucket BUCKETNAME --prefix "folder/subfolder/" --output json --query "[length(Contents[])]"
Illegal token value '(Contents[])]'
(เวอร์ชั่น 1.2.9 ของ AWS-CLI) เมื่อเพียงแค่ใช้--bucket my-bucket
และเมื่อใช้A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist
--bucket s3://my-bucket
(มีอยู่จริงและมีไฟล์มากกว่า 1,000 ไฟล์)
ไปที่การเรียกเก็บเงิน AWS จากนั้นรายงานจากนั้นรายงานการใช้ AWS เลือก Amazon Simple Storage Service จากนั้นเลือก Operation StandardStorage จากนั้นคุณสามารถดาวน์โหลดไฟล์ CSV ที่มี UsageType ของ StorageObjectCount ที่แสดงรายการจำนวนสำหรับที่เก็บข้อมูลแต่ละชุด
คุณสามารถรับจำนวนรวมและประวัติได้อย่างง่ายดายหากคุณไปที่แท็บ "การจัดการ" คอนโซล s3 จากนั้นคลิกที่ "ตัวชี้วัด" ... ภาพหน้าจอของแท็บ
NumberOfObjects (count/day)
แผนภูมิได้หรือไม่ มันจะดีกว่าเนื่องจากมันเกี่ยวข้องกับคำถามโดยตรง ในภาพหน้าจอของคุณคุณกำลังแสดงสิ่งBucketSizeBytes (bytes/day)
ที่มีประโยชน์ซึ่งไม่เกี่ยวข้องกับปัญหาโดยตรง
api จะส่งคืนรายการทีละ 1,000 ตรวจสอบคุณสมบัติ IsTruncated เพื่อดูว่ายังมีอีกไหม หากมีคุณต้องทำการโทรอีกครั้งและส่งผ่านคีย์สุดท้ายที่คุณได้รับเป็นคุณสมบัติเครื่องหมายในการโทรครั้งต่อไป จากนั้นคุณจะวนซ้ำแบบนี้ต่อไปจนกว่า IsTruncated จะเป็นเท็จ
ดูเอกสาร Amazon นี้สำหรับข้อมูลเพิ่มเติม: การวนซ้ำผ่านผลลัพธ์หลายหน้า
หัวข้อเก่า แต่ยังคงมีความเกี่ยวข้องขณะที่ฉันกำลังมองหาคำตอบจนกว่าฉันจะคิดออก ฉันต้องการนับไฟล์โดยใช้เครื่องมือที่ใช้ GUI (เช่นไม่มีรหัส) ฉันใช้เครื่องมือที่เรียกว่า 3Hub แล้วสำหรับการลากและวางการถ่ายโอนไปยังและจาก S3 ฉันต้องการทราบจำนวนไฟล์ที่ฉันมีในที่เก็บข้อมูลชุดใดชุดหนึ่ง (ฉันไม่คิดว่าการเรียกเก็บเงินแบ่งเป็นส่วนย่อย)
So, using 3Hub,
- list the contents of the bucket (looks basically like a finder or explorer window)
- go to the bottom of the list, click 'show all'
- select all (ctrl+a)
- choose copy URLs from right-click menu
- paste the list into a text file (I use TextWrangler for Mac)
- look at the line count
ฉันมีไฟล์ 20521 ในที่ฝากข้อมูลและนับจำนวนไฟล์ในเวลาน้อยกว่าหนึ่งนาที
ฉันใช้สคริปต์ python จากscalablelogic.com (เพิ่มในการบันทึกนับ) ใช้งานได้ดีมาก
#!/usr/local/bin/python
import sys
from boto.s3.connection import S3Connection
s3bucket = S3Connection().get_bucket(sys.argv[1])
size = 0
totalCount = 0
for key in s3bucket.list():
totalCount += 1
size += key.size
print 'total size:'
print "%.3f GB" % (size*1.0/1024/1024/1024)
print 'total count:'
print totalCount
ใน s3cmd เพียงเรียกใช้คำสั่งต่อไปนี้ (บนระบบ Ubuntu):
s3cmd ls -r s3://mybucket | wc -l
หากคุณใช้ AWS CLI บน Windows คุณสามารถใช้Measure-Object
จาก PowerShell เพื่อรับจำนวนไฟล์ทั้งหมดเช่นเดียวwc -l
กับ * nix
PS C:\> aws s3 ls s3://mybucket/ --recursive | Measure-Object
Count : 25
Average :
Sum :
Maximum :
Minimum :
Property :
หวังว่ามันจะช่วย
หนึ่งในวิธีที่ง่ายที่สุดในการนับจำนวนวัตถุใน s3 คือ:
ขั้นที่ 1: เลือกโฟลเดอร์รากขั้นที่ 2: คลิกที่การกระทำ -> ลบ (เห็นได้ชัดว่าระวังอย่าลบมัน) ขั้นที่ 3: รอสักครู่นาที aws จะแสดงจำนวนวัตถุและขนาดรวมของมัน
โหวตถ้าคุณค้นหาวิธีแก้ปัญหา
ไม่มี API ใดที่จะให้คุณนับได้เพราะไม่มี API เฉพาะของ Amazon ที่จะทำเช่นนั้น คุณต้องเรียกใช้ลิสต์เนื้อหาและนับจำนวนผลลัพธ์ที่ส่งคืน
จากบรรทัดคำสั่งใน AWS CLI ls plus --summarize
ใช้ มันจะให้รายชื่อของรายการทั้งหมดของคุณและจำนวนเอกสารทั้งหมดในที่เก็บข้อมูลเฉพาะ ฉันยังไม่ได้ลองกับถังที่มีถังย่อย:
aws s3 ls "s3://MyBucket" --summarize
ใช้เวลานานหน่อย (ใช้รายการเอกสาร 16 + K ของฉันประมาณ 4 นาที) แต่มันเร็วกว่านับ 1K ต่อครั้ง
การวิเคราะห์คลาสหน่วยเก็บข้อมูล S3 คุณรับ API และคอนโซลได้อย่างไร - https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html
คุณสามารถดาวน์โหลดและติดตั้งเบราว์เซอร์ s3 ได้จากhttp://s3browser.com/ http://s3browser.com/เมื่อคุณเลือกที่เก็บข้อมูลที่มุมขวาตรงกลางคุณจะเห็นจำนวนไฟล์ในที่เก็บข้อมูล แต่ขนาดที่แสดงนั้นไม่ถูกต้องในเวอร์ชันปัจจุบัน
Gubs
วิธีที่ง่ายที่สุดคือการใช้คอนโซลนักพัฒนาซอฟต์แวร์ตัวอย่างเช่นหากคุณใช้ Chrome ให้เลือกเครื่องมือสำหรับนักพัฒนาและคุณสามารถดูสิ่งต่อไปนี้คุณสามารถค้นหาและนับหรือทำการแข่งขันเช่น 280-279 + 1 = 2
...
คุณสามารถใช้สินค้าคงคลัง Amazon S3 ที่จะให้รายชื่อวัตถุในไฟล์ csv แก่คุณ
ฉันพบเครื่องมือเบราว์เซอร์ S3 ผู้ใช้มากมันให้ไฟล์และโฟลเดอร์และจำนวนรวมเช่นกันสำหรับโฟลเดอร์ใด ๆ ที่เกิดซ้ำ
ลิงค์ดาวน์โหลด: https://s3browser.com/download.aspx
สามารถทำได้ด้วยgsutil du
(ใช่เครื่องมือ Google Cloud)
gsutil du s3://mybucket/ | wc -l
คุณสามารถรันคำสั่ง cli นี้เพื่อรับจำนวนไฟล์ทั้งหมดในที่เก็บข้อมูลหรือโฟลเดอร์เฉพาะ
สแกนที่เก็บข้อมูลทั้งหมด
aws s3api list-objects-v2 --bucket testbucket | grep "Key" | wc -l
aws s3api list-objects-v2 --bucket BUCKET_NAME | grep "Key" | wc -l
คุณสามารถใช้คำสั่งนี้เพื่อรับรายละเอียด
aws s3api list-objects-v2 --bucket BUCKET_NAME
สแกนโฟลเดอร์เฉพาะ
aws s3api list-objects-v2 --bucket testbucket --prefix testfolder --start-after testfolder/ | grep "Key" | wc -l
aws s3api list-objects-v2 --bucket BUCKET_NAME --prefix FOLDER_NAME --start-after FOLDER_NAME/ | grep "Key" | wc -l
หากคุณกำลังมองหาไฟล์ที่เฉพาะเจาะจงสมมติว่า.jpg
ภาพคุณสามารถทำสิ่งต่อไปนี้:
aws s3 ls s3://your_bucket | grep jpg | wc -l
ต่อไปนี้เป็นวิธีที่คุณสามารถทำได้โดยใช้ไคลเอนต์ java
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.519</version>
</dependency>
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectListing;
public class AmazonS3Service {
private static final String S3_ACCESS_KEY_ID = "ACCESS_KEY";
private static final String S3_SECRET_KEY = "SECRET_KEY";
private static final String S3_ENDPOINT = "S3_URL";
private AmazonS3 amazonS3;
public AmazonS3Service() {
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProtocol(Protocol.HTTPS);
clientConfiguration.setSignerOverride("S3SignerType");
BasicAWSCredentials credentials = new BasicAWSCredentials(S3_ACCESS_KEY_ID, S3_SECRET_KEY);
AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
AmazonS3ClientBuilder.EndpointConfiguration endpointConfiguration = new AmazonS3ClientBuilder.EndpointConfiguration(S3_ENDPOINT, null);
amazonS3 = AmazonS3ClientBuilder.standard().withCredentials(credentialsProvider).withClientConfiguration(clientConfiguration)
.withPathStyleAccessEnabled(true).withEndpointConfiguration(endpointConfiguration).build();
}
public int countObjects(String bucketName) {
int count = 0;
ObjectListing objectListing = amazonS3.listObjects(bucketName);
int currentBatchCount = objectListing.getObjectSummaries().size();
while (currentBatchCount != 0) {
count += currentBatchCount;
objectListing = amazonS3.listNextBatchOfObjects(objectListing);
currentBatchCount = objectListing.getObjectSummaries().size();
}
return count;
}
}
นี่คือสคริปต์หลาม boto3 เวอร์ชันที่ฝังอยู่ด้านบน
import sys
import boto3
s3 = boto3.resource('s3')
s3bucket = s3.Bucket(sys.argv[1])
size = 0
totalCount = 0
for key in s3bucket.objects.all():
totalCount += 1
size += key.size
print('total size:')
print("%.3f GB" % (size*1.0/1024/1024/1024))
print('total count:')
print(totalCount)`
aws s3 ls s3: // bucket-name / folder-prefix-if-any --recursive | ห้องสุขา -l