Sao chép cấu trúc thư mục nguyên vẹn vào thùng AWS S3


39

Tôi muốn sử dụng cli AWS S3 để sao chép cấu trúc thư mục đầy đủ vào nhóm S3.

Cho đến nay, mọi thứ tôi đã thử sao chép các tệp vào nhóm, nhưng cấu trúc thư mục bị thu gọn. (nói cách khác, mỗi tệp được sao chép vào thư mục gốc của nhóm)

Lệnh tôi sử dụng là:

aws s3 cp --recursive ./logdata/ s3://bucketname/

Tôi cũng đã cố gắng loại bỏ dấu gạch chéo trên chỉ định nguồn của mình (nghĩa là bản sao từ đối số). Tôi cũng đã sử dụng ký tự đại diện để chỉ định tất cả các tệp ... mỗi điều tôi cố gắng chỉ cần sao chép các tệp nhật ký vào thư mục gốc của nhóm.


3
Vâng! Đó chắc chắn là câu trả lời. Không giống như trong Unix, lệnh cp (và lệnh đồng bộ hóa) không tạo thư mục đích ở phía đích trừ khi bạn yêu cầu họ làm như vậy. Vì vậy, nếu bạn aws s3 cp --recursive mylocalsrcdir s3://bucket/sau đó, nó sẽ chỉ đơn giản là đặt các tệp trong kho lưu trữ cục bộ của bạn trong thư mục gốc "thư mục gốc" Nếu bạn làm như vậy aws s3 cp --recursive mydirectory s3://bucket/mydirectorythì nó sẽ tạo lại cấu trúc thư mục ở đầu đích.
đặc vụ

Câu trả lời:


38

Tôi tin rằng đồng bộ hóa là phương pháp bạn muốn. Hãy thử điều này thay thế:

aws s3 sync ./logdata s3://bucketname/

4
... Tôi đã rất hào hứng khi thử nó, nhưng nó cho tôi kết quả tương tự như lệnh cp. Các tệp từ thư mục ./logfiles của tôi đã được sao chép vào "thư mục" gốc trong nhóm. Một điều đã làm việc mặc dù là để thử điều này: aws s3 sync ./logdata s3://bucketname/logdata Cảm ơn vì sự dẫn dắt. --- v
agentv

thật không may, ngay cả với tác nhân gợi ý của bạn, tôi đã nhận được đồng bộ hóa kết quả tương tự không bảo toàn cấu trúc thư mục và chỉ làm phẳng mọi thứ.
niharvey

CẬP NHẬT * - không bao giờ cấu trúc thư mục của tôi bị rối tung trong phần trích xuất
niharvey

9

Tôi đã phải đối mặt với lỗi này trong khi sử dụng một trong hai lệnh này.

$ aws s3 cp --recursive /local/dir s3://s3bucket/
OR
$ aws s3 sync /local/dir s3://s3bucket/

Tôi thậm chí đã nghĩ đến việc gắn thùng S3 cục bộ và sau đó chạy rsync, thậm chí điều đó không thành công (hoặc bị treo trong vài giờ) khi tôi có hàng ngàn tệp.

Cuối cùng, s3cmd làm việc như một bùa.

s3cmd sync /local/dir/ --delete-removed s3://s3bucket/ --exclude="some_file" --exclude="*directory*"  --progress --no-preserve

Điều này không chỉ làm tốt công việc và hiển thị đầu ra khá dài trên bảng điều khiển, mà còn tải lên các tệp lớn theo từng phần.


1
tl; dr: tập tin thẻ hoang dã globalbing hoạt động tốt hơn trong s3cmd đối với tôi. Tuyệt vời như aws-cli - đối với sự cố thao tác tệp S3 một lần của tôi đã không hoạt động ngay lập tức như tôi mong muốn và nghĩ rằng nó có thể-- Tôi đã kết thúc việc cài đặt và sử dụng s3cmd. Bất kể cú pháp và hậu trường nào tôi làm việc theo khái niệm, s3cmd trực quan hơn và phù hợp với khả năng của tôi trong các định kiến. Có thể đó không phải là câu trả lời bạn đến đây, nhưng nó hiệu quả với tôi.
BradChesney79

Điều đó rất hữu ích @ BradChesney79
agentv

Sẽ thật tốt khi mô tả các tùy chọn bạn đang sử dụng trên lệnh đồng bộ hóa. Ngoài ra không có lệnh "cp" cho s3cmd? Tại sao sử dụng đồng bộ thay vì cp?
VinGarcia

4

Sau đây làm việc cho tôi:

aws s3 cp ~/this_directory s3://bucketname/this_directory --recursive

AWS sau đó sẽ "thực hiện" this_directoryvà sao chép tất cả các nội dung địa phương vào đó.


2

Sử dụng tập lệnh sau để sao chép cấu trúc thư mục:

s3Folder="s3://xyz.abc.com/asdf";

for entry in "$asset_directory"*
do
    echo "Processing - $entry"
    if [[ -d  $entry ]]; then
        echo "directory"
        aws s3 cp  --recursive "./$entry" "$s3Folder/$entry/"
    else
        echo "file"
        aws s3 cp "./$entry" "$s3Folder/"
    fi
done

2

Tôi không thể nhận s3 synchoặc s3 cplàm việc trên một thư mục 55 GB với hàng ngàn tệp và hơn hai chục thư mục con bên trong. Cố gắng đồng bộ toàn bộ thư mục sẽ chỉ khiến awscli thất bại trong âm thầm mà không tải lên bất cứ thứ gì vào thùng.

Đã kết thúc việc này để trước tiên đồng bộ hóa tất cả các thư mục con và nội dung của chúng (cấu trúc thư mục được giữ nguyên):

nice find . -mindepth 1 -maxdepth 1 -type d | cut -c 3- | while read line; do aws s3 sync $"$line" "s3://bucketname/$line"; done

Sau đó, tôi đã làm điều này để có được 30.000 tệp ở cấp cao nhất:

nice find . -mindepth 1 -maxdepth 1 -type f | cut -c 3- | while read line; do aws s3 cp "$line" "s3://bucketname/";

Đảm bảo xem tải trên máy chủ (protip bạn có thể sử dụng wđể chỉ hiển thị tải) và ctrl-ztạm dừng lệnh nếu tải quá cao. ( fgđể tiếp tục một lần nữa).

Đặt điều này ở đây trong trường hợp nó giúp bất cứ ai trong tình huống tương tự.

Ghi chú:

-mindepth 1 không bao gồm .

-maxdepth 1ngăn tìm từ danh sách nội dung của các thư mục con, vì s3 syncxử lý chúng thành công.

cut -c 3- xóa "./" từ đầu mỗi kết quả khỏi find.


1

Ngoài ra, bạn cũng có thể thử minio client aka mc

$ mc cp Desktop/test/test/test.txt s3/miniocloud/Desktop/test/test/

Hy vọng nó sẽ giúp.

PS: Tôi là một trong những người đóng góp cho dự án.


1
Tín dụng khi tín dụng đáo hạn: mc đã thực hiện công việc và bảo toàn cấu trúc thư mục - tuyệt vời! Tôi đã bực mình khi cài đặt> 200 megabyte Python & Pip crap để sử dụng awscli và để đọc ở đây rằng nó làm sập cấu trúc dir ..
joonas.fi

0

(Cải thiện giải pháp của Shishir )

  • Lưu tập lệnh sau vào một tệp (Tôi đặt tên tệp s3Copy.sh)
path=$1 # the path of the directory where the files and directories that need to be copied are located
s3Dir=$2 # the s3 bucket path

for entry in "$path"/*; do
    name=`echo $entry | sed 's/.*\///'`  # getting the name of the file or directory
    if [[ -d  $entry ]]; then  # if it is a directory
        aws s3 cp  --recursive "$name" "$s3Dir/$name/"
    else  # if it is a file
        aws s3 cp "$name" "$s3Dir/"
    fi
done
  • Chạy nó như sau:
    /PATH/TO/s3Copy.sh /PATH/TO/ROOT/DIR/OF/SOURCE/FILESandDIRS PATH/OF/S3/BUCKET
    Ví dụ: nếu s3Copy.shđược lưu trong thư mục chính và tôi muốn sao chép tất cả các tệp và thư mục nằm trong thư mục hiện tại, sau đó tôi chạy nó:
    ~/s3Copy.sh . s3://XXX/myBucket

Bạn có thể dễ dàng sửa đổi kịch bản để cho phép lập luận khác s3 cpnhư --include, --exclude, ...


Thật là tuyệt vời. Nghệ nhân, trong thực tế.
Agentv
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.