ฉันมีกลุ่มฝาก amazon s3 ที่มีชื่อไฟล์นับหมื่นรายการ วิธีที่ง่ายที่สุดในการรับไฟล์ข้อความที่แสดงชื่อไฟล์ทั้งหมดในที่เก็บข้อมูลคืออะไร
ฉันมีกลุ่มฝาก amazon s3 ที่มีชื่อไฟล์นับหมื่นรายการ วิธีที่ง่ายที่สุดในการรับไฟล์ข้อความที่แสดงชื่อไฟล์ทั้งหมดในที่เก็บข้อมูลคืออะไร
คำตอบ:
ผมขอแนะนำให้ใช้Boto จากนั้นก็เป็นงูหลามสองแถวอย่างรวดเร็ว:
from boto.s3.connection import S3Connection
conn = S3Connection('access-key','secret-access-key')
bucket = conn.get_bucket('bucket')
for key in bucket.list():
print key.name.encode('utf-8')
บันทึกสิ่งนี้เป็น list.py เปิดเทอร์มินัลแล้วเรียกใช้:
$ python list.py > results.txt
เอกสารประกอบสำหรับaws s3 ls
AWS เพิ่งเปิดตัวเครื่องมือบรรทัดคำสั่งของพวกเขา มันใช้งานได้เหมือน boto และสามารถติดตั้งโดยใช้sudo easy_install awscli
หรือsudo pip install awscli
เมื่อคุณติดตั้งแล้วคุณสามารถเรียกใช้
aws s3 ls
ซึ่งจะแสดงให้คุณเห็นถังทั้งหมดที่มีอยู่
CreationTime Bucket
------------ ------
2013-07-11 17:08:50 mybucket
2013-07-24 14:55:44 mybucket2
จากนั้นคุณสามารถสอบถามที่ฝากข้อมูลเฉพาะสำหรับไฟล์
คำสั่ง :
aws s3 ls s3://mybucket
ผลผลิต :
Bucket: mybucket
Prefix:
LastWriteTime Length Name
------------- ------ ----
PRE somePrefix/
2013-07-25 17:06:27 88 test.txt
นี่จะแสดงไฟล์ทั้งหมดของคุณ
--recursive
ตั้งค่าสถานะเพื่อดูวัตถุทั้งหมดภายใต้ไดเรกทอรีที่ระบุ
s3cmdมีค่าสำหรับสิ่งนี้
$ s3cmd ls -r s3://yourbucket/ | awk '{print $4}' > objects_in_bucket
s3cmd
ส่งคืนชื่อไฟล์เรียงตามวันที่ มีวิธีใด ๆ ที่ฉันสามารถทำให้มันกลับพูดเฉพาะแฟ้มที่ได้รับการเพิ่มเข้ามาหลังจาก2015-10-23 20:46
?
ระวังรายการอเมซอนจะส่งคืนไฟล์เพียง 1,000 ไฟล์เท่านั้น หากคุณต้องการวนซ้ำทุกไฟล์คุณต้องแบ่งหน้าผลลัพธ์โดยใช้เครื่องหมาย:
ในทับทิมโดยใช้aws-s3
bucket_name = 'yourBucket'
marker = ""
AWS::S3::Base.establish_connection!(
:access_key_id => 'your_access_key_id',
:secret_access_key => 'your_secret_access_key'
)
loop do
objects = Bucket.objects(bucket_name, :marker=>marker, :max_keys=>1000)
break if objects.size == 0
marker = objects.last.key
objects.each do |obj|
puts "#{obj.key}"
end
end
ปลาย
หวังว่านี่จะช่วยได้
อัปเดต 15-02-2019:
คำสั่งนี้จะให้รายการถังทั้งหมดใน AWS S3:
aws s3 ls
คำสั่งนี้จะให้รายการของวัตถุระดับบนสุดทั้งหมดในที่เก็บ AWS S3:
aws s3 ls bucket-name
คำสั่งนี้จะให้รายการของวัตถุทั้งหมดในที่เก็บ AWS S3:
aws s3 ls bucket-name --recursive
คำสั่งนี้จะวางรายการทั้งหมดไว้ในที่เก็บ AWS S3 ... ภายในไฟล์ข้อความในไดเรกทอรีปัจจุบันของคุณ:
aws s3 ls bucket-name --recursive | cat >> file-name.txt
สำหรับนักพัฒนา Scala นี่คือฟังก์ชั่นวนซ้ำเพื่อเรียกใช้การสแกนแบบเต็มและแมปเนื้อหาของที่เก็บ AmazonS3 โดยใช้AWS SDK สำหรับ Javaอย่างเป็นทางการ
import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.services.s3.model.{S3ObjectSummary, ObjectListing, GetObjectRequest}
import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala}
def map[T](s3: AmazonS3Client, bucket: String, prefix: String)(f: (S3ObjectSummary) => T) = {
def scan(acc:List[T], listing:ObjectListing): List[T] = {
val summaries = asScala[S3ObjectSummary](listing.getObjectSummaries())
val mapped = (for (summary <- summaries) yield f(summary)).toList
if (!listing.isTruncated) mapped.toList
else scan(acc ::: mapped, s3.listNextBatchOfObjects(listing))
}
scan(List(), s3.listObjects(bucket, prefix))
}
ในการเรียกใช้map()
ฟังก์ชั่นcurried ข้างต้นเพียงแค่ผ่านวัตถุ AmazonS3Client ที่สร้างไว้แล้วและเริ่มต้นอย่างถูกต้องแล้ว (อ้างถึงAWS SDKอย่างเป็นทางการสำหรับการอ้างอิง Java API ) ชื่อที่ฝากข้อมูลและชื่อคำนำหน้าในรายการพารามิเตอร์แรก ผ่านฟังก์ชั่นที่f()
คุณต้องการนำไปใช้จับคู่แต่ละวัตถุสรุปในรายการพารามิเตอร์ที่สอง
ตัวอย่างเช่น
val keyOwnerTuples = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner))
จะส่งคืนรายการ(key, owner)
tuples ทั้งหมดในที่ฝากข้อมูล / คำนำหน้า
หรือ
map(s3, "bucket", "prefix")(s => println(s))
ตามปกติคุณจะเข้าหาMonads ใน Function Programming
mapped.toList
โดยไม่มีสิ่งใดก่อนหน้านี้acc
มีสองวิธีที่คุณสามารถไปได้ ใช้ Python
import boto3
sesssion = boto3.Session(aws_access_key_id, aws_secret_access_key)
s3 = sesssion.resource('s3')
bucketName = 'testbucket133'
bucket = s3.Bucket(bucketName)
for obj in bucket.objects.all():
print(obj.key)
อีกวิธีหนึ่งคือการใช้ AWS cli สำหรับมัน
aws s3 ls s3://{bucketname}
example : aws s3 ls s3://testbucket133
s3 = boto3.resource('s3')
session
วิธีการ AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
หลังจากแซคฉันขอแนะนำbotoด้วย แต่ฉันต้องการสร้างความแตกต่างเล็กน้อยให้กับโค้ดของเขา:
conn = boto.connect_s3('access-key', 'secret'key')
bucket = conn.lookup('bucket-name')
for key in bucket:
print key.name
conn.lookup
ส่งคืนNone
แทนที่จะส่งS3ResponseError(NoSuchBucket)
ข้อผิดพลาด
aws s3api list-objects --bucket bucket-name
สำหรับรายละเอียดเพิ่มเติมดูที่นี่ - http://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects.html
aws s3api list-objects --bucket <bucket-name>
สำหรับ Python boto3 หลังจากใช้แล้วaws configure
:
import boto3
s3 = boto3.resource('s3')
bucket = s3.Bucket('name')
for obj in bucket.objects.all():
print(obj.key)
ก่อนให้แน่ใจว่าคุณอยู่บนinstance terminal
และคุณมีall access
ของS3
ในIAM
คุณกำลังใช้ ตัวอย่างเช่นฉันใช้อินสแตนซ์ ec2
pip3 install awscli
จากนั้นกำหนดค่า aws
aws configure
จากนั้นเติม excredantials เช่น: -
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json (or just press enter)
ตอนนี้ดูที่เก็บข้อมูลทั้งหมด
aws s3 ls
เก็บชื่อถังทั้งหมด
aws s3 ls > output.txt
ดูโครงสร้างไฟล์ทั้งหมดในที่เก็บข้อมูล
aws s3 ls bucket-name --recursive
จัดเก็บโครงสร้างไฟล์ในที่เก็บข้อมูลแต่ละชุด
aws s3 ls bucket-name --recursive > file_Structure.txt
หวังว่านี่จะช่วยได้
AWS CLI สามารถให้คุณดูไฟล์ทั้งหมดของที่ฝากข้อมูล S3 ได้อย่างรวดเร็วและช่วยในการดำเนินการอื่น ๆ ด้วย
วิธีใช้ AWS CLI ทำตามขั้นตอนด้านล่าง:
หากต้องการดูไฟล์ทั้งหมดของคำสั่ง S3 bucket ให้ใช้
aws s3 ls s3: // your_bucket_name --recursive
การอ้างอิงเพื่อใช้ AWS cli สำหรับบริการ AWS ต่างๆ: https://docs.aws.amazon.com/cli/latest/reference/
ใน Java คุณสามารถรับกุญแจได้โดยใช้ ListObjects (ดูเอกสาร AWS )
FileWriter fileWriter;
BufferedWriter bufferedWriter;
// [...]
AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider());
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName)
.withPrefix("myprefix");
ObjectListing objectListing;
do {
objectListing = s3client.listObjects(listObjectsRequest);
for (S3ObjectSummary objectSummary :
objectListing.getObjectSummaries()) {
// write to file with e.g. a bufferedWriter
bufferedWriter.write(objectSummary.getKey());
}
listObjectsRequest.setMarker(objectListing.getNextMarker());
} while (objectListing.isTruncated());
โค้ดในไพ ธ อนใช้lib "boto" ที่ยอดเยี่ยม รหัสส่งคืนรายการไฟล์ในที่เก็บข้อมูลและจัดการข้อยกเว้นสำหรับถังที่หายไป
import boto
conn = boto.connect_s3( <ACCESS_KEY>, <SECRET_KEY> )
try:
bucket = conn.get_bucket( <BUCKET_NAME>, validate = True )
except boto.exception.S3ResponseError, e:
do_something() # The bucket does not exist, choose how to deal with it or raise the exception
return [ key.name.encode( "utf-8" ) for key in bucket.list() ]
อย่าลืมแทนที่ <PLACE_HOLDERS> ด้วยค่าของคุณ
คำสั่งด้านล่างจะได้รับชื่อไฟล์ทั้งหมดจากที่เก็บ AWS S3 ของคุณและเขียนเป็นไฟล์ข้อความในไดเรกทอรีปัจจุบันของคุณ:
aws s3 ls s3://Bucketdirectory/Subdirectory/ | cat >> FileNames.txt
หรือคุณสามารถใช้ Minio Client aka mc โอเพ่นซอร์สและเข้ากันได้กับ AWS S3 มันสามารถใช้ได้สำหรับLinux, Windows, Mac, FreeBSD
สิ่งที่คุณต้องทำคือเรียกใช้คำสั่งmc lsเพื่อแสดงรายการเนื้อหา
$ mc ls s3 / kline / [2016-04-30 13:20:47 IST] 1.1MiB 1.jpg [2016-04-30 16:03:55 IST] 7.5KiB docker.png [2016-04-30 15:16:17 IST] 50KiB pi.png [2016-05-10 14:34:39 IST] 365KiB upton.pdf
บันทึก:
การติดตั้ง Minio Client Linux Download mc สำหรับ:
$ chmod 755 mc $ ./mc - ช่วย
การตั้งค่าข้อมูลรับรอง AWS ด้วยไคลเอนต์ Minio
$ mc config host เพิ่ม mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12
หมายเหตุ: โปรดแทนที่ mys3 ด้วยนามแฝงที่คุณต้องการสำหรับบัญชีนี้และ BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 ของคุณด้วย AWS ACCESS-KEY และ SECRET-KEY
หวังว่ามันจะช่วย
คำเตือน: ฉันทำงานให้Minio
คุณสามารถใช้มาตรฐาน s3 api -
aws s3 ls s3://root/folder1/folder2/
คุณสามารถแสดงรายการไฟล์ทั้งหมดในที่เก็บ aws s3 โดยใช้คำสั่ง
aws s3 ls path/to/file
และเพื่อบันทึกลงในไฟล์ให้ใช้
aws s3 ls path/to/file >> save_result.txt
หากคุณต้องการผนวกผลลัพธ์ของคุณเป็นไฟล์อื่น:
aws s3 ls path/to/file > save_result.txt
ถ้าคุณต้องการที่จะล้างสิ่งที่เขียนก่อน
มันจะทำงานได้ทั้งใน windows และ Linux
ในจาวาสคริปต์คุณสามารถใช้
s3.listObjects (params, function (err, result) {});
เพื่อรับวัตถุทั้งหมดในที่เก็บข้อมูล คุณจะต้องส่งชื่อถังภายในparams (Bucket: ชื่อ)
function showUploads(){
if (!class_exists('S3')) require_once 'S3.php';
// AWS access info
if (!defined('awsAccessKey')) define('awsAccessKey', '234567665464tg');
if (!defined('awsSecretKey')) define('awsSecretKey', 'dfshgfhfghdgfhrt463457');
$bucketName = 'my_bucket1234';
$s3 = new S3(awsAccessKey, awsSecretKey);
$contents = $s3->getBucket($bucketName);
echo "<hr/>List of Files in bucket : {$bucketName} <hr/>";
$n = 1;
foreach ($contents as $p => $v):
echo $p."<br/>";
$n++;
endforeach;
}
# find like file listing for s3 files
aws s3api --profile <<profile-name>> \
--endpoint-url=<<end-point-url>> list-objects \
--bucket <<bucket-name>> --query 'Contents[].{Key: Key}'
คำตอบ Scala รุ่นประยุกต์และปรับปรุงโดย Paolo:
import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala}
import com.amazonaws.services.s3.AmazonS3
import com.amazonaws.services.s3.model.{ListObjectsRequest, ObjectListing, S3ObjectSummary}
def buildListing(s3: AmazonS3, request: ListObjectsRequest): List[S3ObjectSummary] = {
def buildList(listIn: List[S3ObjectSummary], bucketList:ObjectListing): List[S3ObjectSummary] = {
val latestList: List[S3ObjectSummary] = bucketList.getObjectSummaries.toList
if (!bucketList.isTruncated) listIn ::: latestList
else buildList(listIn ::: latestList, s3.listNextBatchOfObjects(bucketList))
}
buildList(List(), s3.listObjects(request))
}
ลอกข้อมูลทั่วไปและใช้ ListObjectRequest ที่สร้างโดยผู้สร้าง SDK
public static Dictionary<string, DateTime> ListBucketsByCreationDate(string AccessKey, string SecretKey)
{
return AWSClientFactory.CreateAmazonS3Client(AccessKey,
SecretKey).ListBuckets().Buckets.ToDictionary(s3Bucket => s3Bucket.BucketName,
s3Bucket => DateTime.Parse(s3Bucket.CreationDate));
}
ใน PHP คุณสามารถรับรายการวัตถุ AWS-S3 ทั้งหมดในที่เก็บข้อมูลเฉพาะโดยใช้การโทรต่อไปนี้
$S3 = \Aws\S3\S3Client::factory(array('region' => $region,));
$iterator = $S3->getIterator('ListObjects', array('Bucket' => $bucket));
foreach ($iterator as $obj) {
echo $obj['Key'];
}
คุณสามารถเปลี่ยนเส้นทางการส่งออกของรหัสด้านบนในไฟล์เพื่อรับรายการของคีย์
ใช้ plumbum เพื่อตัด cli และคุณจะมีไวยากรณ์ที่ชัดเจน:
import plumbum as pb
folders = pb.local['aws']('s3', 'ls')
โปรดลองสคริปต์ทุบตีนี้ มันใช้คำสั่ง curl โดยไม่จำเป็นต้องพึ่งพาภายนอกใด ๆ
bucket=<bucket_name>
region=<region_name>
awsAccess=<access_key>
awsSecret=<secret_key>
awsRegion="${region}"
baseUrl="s3.${awsRegion}.amazonaws.com"
m_sed() {
if which gsed > /dev/null 2>&1; then
gsed "$@"
else
sed "$@"
fi
}
awsStringSign4() {
kSecret="AWS4$1"
kDate=$(printf '%s' "$2" | openssl dgst -sha256 -hex -mac HMAC -macopt "key:${kSecret}" 2>/dev/null | m_sed 's/^.* //')
kRegion=$(printf '%s' "$3" | openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kDate}" 2>/dev/null | m_sed 's/^.* //')
kService=$(printf '%s' "$4" | openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kRegion}" 2>/dev/null | m_sed 's/^.* //')
kSigning=$(printf 'aws4_request' | openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kService}" 2>/dev/null | m_sed 's/^.* //')
signedString=$(printf '%s' "$5" | openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kSigning}" 2>/dev/null | m_sed 's/^.* //')
printf '%s' "${signedString}"
}
if [ -z "${region}" ]; then
region="${awsRegion}"
fi
# Initialize helper variables
authType='AWS4-HMAC-SHA256'
service="s3"
dateValueS=$(date -u +'%Y%m%d')
dateValueL=$(date -u +'%Y%m%dT%H%M%SZ')
# 0. Hash the file to be uploaded
# 1. Create canonical request
# NOTE: order significant in ${signedHeaders} and ${canonicalRequest}
signedHeaders='host;x-amz-content-sha256;x-amz-date'
canonicalRequest="\
GET
/
host:${bucket}.s3.amazonaws.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date:${dateValueL}
${signedHeaders}
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
# Hash it
canonicalRequestHash=$(printf '%s' "${canonicalRequest}" | openssl dgst -sha256 -hex 2>/dev/null | m_sed 's/^.* //')
# 2. Create string to sign
stringToSign="\
${authType}
${dateValueL}
${dateValueS}/${region}/${service}/aws4_request
${canonicalRequestHash}"
# 3. Sign the string
signature=$(awsStringSign4 "${awsSecret}" "${dateValueS}" "${region}" "${service}" "${stringToSign}")
# Upload
curl -g -k "https://${baseUrl}/${bucket}" \
-H "x-amz-content-sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" \
-H "x-amz-Date: ${dateValueL}" \
-H "Authorization: ${authType} Credential=${awsAccess}/${dateValueS}/${region}/${service}/aws4_request,SignedHeaders=${signedHeaders},Signature=${signature}"
วิธีที่ง่ายที่สุดในการรับไฟล์ข้อความที่ใช้งานได้ดีคือดาวน์โหลดเบราว์เซอร์ S3 http://s3browser.com/และใช้ตัวสร้าง URL ของเว็บเพื่อสร้างรายการเส้นทางการเชื่อมโยงที่สมบูรณ์ มันมีประโยชน์มากและเกี่ยวข้องกับการคลิกประมาณ 3
-Browse to Folder
-Select All
-Generate Urls
ขอให้คุณโชคดี
boto.s3.bucketlistresultset.BucketListResultSet
กล่าวถึงเงื่อนไข "ชื่อไฟล์นับหมื่น" ที่กล่าวถึงในคำถาม