Tôi có một thùng am3 s3 có hàng chục ngàn tên tệp trong đó. Cách dễ nhất để có được một tệp văn bản liệt kê tất cả các tên tệp trong nhóm?
Tôi có một thùng am3 s3 có hàng chục ngàn tên tệp trong đó. Cách dễ nhất để có được một tệp văn bản liệt kê tất cả các tên tệp trong nhóm?
Câu trả lời:
Tôi khuyên bạn nên sử dụng boto . Sau đó là một vài dòng trăn nhanh chóng :
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')
Lưu cái này dưới dạng list.py, mở một thiết bị đầu cuối, rồi chạy:
$ python list.py > results.txt
Tài liệu cho aws s3 ls
AWS gần đây đã phát hành Công cụ dòng lệnh của họ. Điều này hoạt động giống như boto và có thể được cài đặt bằng sudo easy_install awscli
hoặcsudo pip install awscli
Khi bạn đã cài đặt, bạn có thể chạy
aws s3 ls
Nó sẽ cho bạn thấy tất cả các thùng có sẵn của bạn
CreationTime Bucket
------------ ------
2013-07-11 17:08:50 mybucket
2013-07-24 14:55:44 mybucket2
Sau đó, bạn có thể truy vấn một nhóm cụ thể cho các tệp.
Lệnh :
aws s3 ls s3://mybucket
Đầu ra :
Bucket: mybucket
Prefix:
LastWriteTime Length Name
------------- ------ ----
PRE somePrefix/
2013-07-25 17:06:27 88 test.txt
Điều này sẽ cho bạn thấy tất cả các tập tin của bạn.
--recursive
cờ để xem tất cả các đối tượng trong thư mục được chỉ định
s3cmd là vô giá cho loại điều này
$ s3cmd ls -r s3://yourbucket/ | awk '{print $4}' > objects_in_bucket
s3cmd
trả về tên tệp được sắp xếp theo ngày. Có cách nào tôi có thể làm cho nó trở lại chỉ nói những tập tin đã được thêm vào sau 2015-10-23 20:46
không?
Hãy cẩn thận, danh sách amazon chỉ trả về 1000 tệp. Nếu bạn muốn lặp lại tất cả các tệp, bạn phải phân trang kết quả bằng cách sử dụng các dấu:
Trong ruby sử dụng 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
kết thúc
Hy vọng điều này sẽ giúp, vincent
Cập nhật ngày 15/02/2016:
Lệnh này sẽ cung cấp cho bạn một danh sách tất cả các nhóm trong AWS S3:
aws s3 ls
Lệnh này sẽ cung cấp cho bạn một danh sách tất cả các đối tượng cấp cao nhất trong nhóm AWS S3:
aws s3 ls bucket-name
Lệnh này sẽ cung cấp cho bạn một danh sách TẤT CẢ các đối tượng bên trong nhóm AWS S3:
aws s3 ls bucket-name --recursive
Lệnh này sẽ đặt một danh sách TẤT CẢ bên trong nhóm AWS S3 ... bên trong tệp văn bản trong thư mục hiện tại của bạn:
aws s3 ls bucket-name --recursive | cat >> file-name.txt
Đối với các nhà phát triển Scala, đây là chức năng đệ quy để thực hiện quét toàn bộ và ánh xạ nội dung của nhóm AmazonS3 bằng SDK AWS chính thức cho 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))
}
Để gọi hàm được xử lý ở trên map()
, chỉ cần chuyển đối tượng AmazonS3Client đã được xây dựng (và khởi tạo đúng cách) (tham khảo SDK AWS chính thức cho Tham chiếu API Java ), tên nhóm và tên tiền tố trong danh sách tham số đầu tiên. Đồng thời chuyển hàm f()
bạn muốn áp dụng để ánh xạ từng tóm tắt đối tượng trong danh sách tham số thứ hai.
Ví dụ
val keyOwnerTuples = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner))
sẽ trả về danh sách đầy đủ các (key, owner)
bộ dữ liệu trong nhóm / tiền tố đó
hoặc là
map(s3, "bucket", "prefix")(s => println(s))
như bạn thường tiếp cận bởi Monads trong Lập trình hàm
mapped.toList
mà không có bất kỳ lần nào trước đóacc
Có một số cách bạn có thể đi về nó. Sử dụng 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)
Một cách khác là sử dụng AWS cli cho nó
aws s3 ls s3://{bucketname}
example : aws s3 ls s3://testbucket133
s3 = boto3.resource('s3')
session
phương thức. AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
Sau zach tôi cũng muốn giới thiệu boto , nhưng tôi cần tạo một chút khác biệt cho mã của anh ấy:
conn = boto.connect_s3('access-key', 'secret'key')
bucket = conn.lookup('bucket-name')
for key in bucket:
print key.name
conn.lookup
trả về None
thay vì ném S3ResponseError(NoSuchBucket)
lỗi
aws s3api list-objects --bucket bucket-name
Để biết thêm chi tiết, xem tại đây - http://docs.aws.amazon.com/cli/latest/reference/s3api/list-objects.html
aws s3api list-objects --bucket <bucket-name>
Làm đầu tiên chắc chắn bạn đang ở trên một instance terminal
và bạn có all access
của S3
trong IAM
bạn đang sử dụng. Ví dụ tôi đã sử dụng một ví dụ ec2.
pip3 install awscli
Sau đó cấu hình aws
aws configure
Sau đó điền outcredantials ex: -
$ 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)
Bây giờ, Xem tất cả các thùng
aws s3 ls
Lưu trữ tất cả các tên xô
aws s3 ls > output.txt
Xem tất cả cấu trúc tệp trong một nhóm
aws s3 ls bucket-name --recursive
Lưu trữ cấu trúc tệp trong mỗi nhóm
aws s3 ls bucket-name --recursive > file_Structure.txt
Hi vọng điêu nay co ich.
AWS CLI có thể cho phép bạn xem tất cả các tệp của nhóm S3 một cách nhanh chóng và cũng giúp thực hiện các hoạt động khác.
Để sử dụng AWS CLI, hãy làm theo các bước dưới đây:
Để xem tất cả các tệp của nhóm S3, hãy sử dụng lệnh
aws s3 ls s3: // your_bucket_name --recursive
Tham khảo để sử dụng AWS cli cho các dịch vụ AWS khác nhau: https://docs.aws.amazon.com/cli/latest/reference/
Trong Java, bạn có thể nhận các khóa bằng cách sử dụng ListObjects (xem tài liệu 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());
Mã trong python sử dụng lib "boto" tuyệt vời . Mã này trả về một danh sách các tệp trong một nhóm và cũng xử lý các trường hợp ngoại lệ cho các thùng bị thiếu.
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() ]
Đừng quên thay thế <PLACE_HOLDERS> bằng các giá trị của bạn.
Lệnh dưới đây sẽ nhận được tất cả các tên tệp từ nhóm AWS S3 của bạn và ghi vào tệp văn bản trong thư mục hiện tại của bạn:
aws s3 ls s3://Bucketdirectory/Subdirectory/ | cat >> FileNames.txt
Ngoài ra, bạn có thể sử dụng Minio Client aka mc. Nguồn mở của nó và tương thích với AWS S3. Nó có sẵn cho Linux, Windows, Mac, FreeBSD.
Tất cả những gì bạn phải làm là chạy lệnh mc ls để liệt kê nội dung.
$ mc ls s3 / kline / [2016-04-30 13:20:47 IST] 1.1MiB 1.jpg [2016-04-30 16:03:55 IST] Docker 7.5KiB.png [2016-04-30 15:16:17 IST] 50KiB pi.png [2016-05-10 14:34:39 IST] 365KiB upton.pdf
Ghi chú:
Cài đặt Minio Client Linux Tải mc cho:
$ chmod 755 mc $ ./mc - trợ giúp
Thiết lập thông tin đăng nhập AWS với Minio Client
$ mc cấu hình máy chủ thêm mys3 https://s3.amazonaws.com BKIKJAA5BMMU2RHO6IBB V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12
Lưu ý: Vui lòng thay thế mys3 bằng bí danh mà bạn muốn cho tài khoản này và, BKIKJAA5BMMU2RHO6IBB, V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12 bằng AWS ACCESS-KEY của bạn
Hy vọng nó giúp.
Tuyên bố miễn trừ trách nhiệm: Tôi làm việc cho Minio
Bạn có thể liệt kê tất cả các tệp, trong thùng aws s3 bằng lệnh
aws s3 ls path/to/file
và để lưu nó trong một tập tin, sử dụng
aws s3 ls path/to/file >> save_result.txt
nếu bạn muốn nối kết quả của mình vào một tệp khác:
aws s3 ls path/to/file > save_result.txt
nếu bạn muốn xóa những gì đã được viết trước đó.
Nó sẽ hoạt động cả trong windows và Linux.
Trong javascript bạn có thể sử dụng
s3.listObjects (params, hàm (err, result) {});
để có được tất cả các đối tượng trong xô. bạn phải chuyển tên nhóm bên trong params (Nhóm: tên) .
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}'
Phiên bản đơn giản và cập nhật của câu trả lời Scala của 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))
}
Tước ra các tổng quát và sử dụng ListObjectRequest được tạo bởi các nhà xây dựng 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));
}
Trong PHP, bạn có thể nhận được danh sách đầy đủ các đối tượng AWS-S3 bên trong nhóm cụ thể bằng cách sử dụng cuộc gọi sau
$S3 = \Aws\S3\S3Client::factory(array('region' => $region,));
$iterator = $S3->getIterator('ListObjects', array('Bucket' => $bucket));
foreach ($iterator as $obj) {
echo $obj['Key'];
}
Bạn có thể chuyển hướng đầu ra của đoạn mã trên vào một tệp để lấy danh sách các khóa.
Sử dụng plumbum để bọc cli và bạn sẽ có một cú pháp rõ ràng:
import plumbum as pb
folders = pb.local['aws']('s3', 'ls')
vui lòng thử tập lệnh bash này. nó sử dụng lệnh curl mà không cần bất kỳ phụ thuộc bên ngoài nào
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}"
Cách DỄ DÀNG nhất để có được một tệp văn bản rất có thể sử dụng là tải xuống Trình duyệt S3 http://s3browser.com/ và sử dụng Trình tạo URL Web để tạo danh sách các đường dẫn liên kết hoàn chỉnh. Nó rất tiện dụng và liên quan đến khoảng 3 lần nhấp.
-Browse to Folder
-Select All
-Generate Urls
Nhưng điêu tôt đẹp nhât se đên vơi bạn.
boto.s3.bucketlistresultset.BucketListResultSet
giải quyết điều kiện "hàng chục ngàn tên tệp" được đề cập trong câu hỏi.