Moving many files in the same bucket - amazon-s3

I've got 200k files in a bucket which I need to move into a sub folder within the same bucket, whats the best approach?

I recently encountered the same problem. I solved it using the command line API.
http://docs.aws.amazon.com/cli/latest/index.html
http://docs.aws.amazon.com/cli/latest/reference/s3/mv.html
aws s3 mv s3://BUCKETNAME/myfolder/photos/ s3://BUCKETNAME/myotherfolder/photos/ --recursive
I had a need for the objects to be publicly viewable, so I added the --acl public-read option.

Recently was able to do this with one command. Went much faster than individual requests for each file too.
Running a snippet like this:
aws s3 mv s3://bucket-name/ s3://bucket-name/subfolder --recursive --exclude "*" --include "*.txt"
Use the --include flag to selectively pick up the files you want

There is no 'Rename' operation though it would be great if there was.
Instead, you need to loop through each item that you want to rename, perform a copy to a new object and then a delete on the old object.
http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectCOPY.html
http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectDELETE.html
Note: for simplistic purposes I'm assuming you don't have versioning enabled on your bucket.

I had this same problem and I ended up using aws s3 mv along with a bash for loop.
I did aws ls bucket_name to get all of the files in the bucket. Then I decided which files I wanted to move and added them to file_names.txt.
Then I ran the following snippet to move all of the files:
for f in $(cat file_names.txt)
do
aws s3 mv s3://bucket-name/$f s3://bucket-name/subfolder/$f
done

if your files are in a folder, you can use s3cmd tool
s3cmd cp --recursive s3://bucket/folder/ s3://bucket/sub_folder/
Ps: I'm assuming you have already installed and configured s3cmd

The below script works perfectly to me without any issues
for i in `cat s3folders`
do
aws s3 mv s3://Bucket_Name/"$i"/ s3://Another_Bucket_Name/ --recursive
done
It also delete the empty folder from source once the files moved to the target.

Related

copy to destination and delete from source using single command

Wanted to copy files to destination bucket and delete the same from source if it is success which is from two different bucket in different region.
Is that gsutil cp command support this using -d or any suggestion will be great helpful. Thanks
sorry for not noticing it properly, i was able to do that using gsutil -m mv gs://s_bucketname/foldername gs://d_bucketname/foldername

aws s3 cp download files to local of matching file name

I am trying to download some images from amazon s3 bucket with name like 126782129_06_12_2013.jpg. I have tried using:
aws s3 cp s3://[s3 folder] [local folder] --exclude "*" --include "*_*.jpg"--recursive
But it gives not output.
Can someone help me with this?
Edit:
Some files are named as 1525780172306_bs516Z2.jpg but I want to ignore such files any only get the files containing digits after the '_' sign.
Aws cp doesnot support regex.
documentation
I downloaded all files and deleted unwanted files.
There should be better alternaties.

Non coder need to download from S3 using AWS CLI

I am trying to download a folder from S3 using AWS CLI and I think the issue I am having is the target folder and what I need to describe to get the folder to go to!
I have all the inital steps in place configure, keys, region and that is all good but its the call and place to deliver to being the issue I think.
[aws s3 cp s3://arn:aws:s3:::temporary-bucket-to-restore-website-files/ folder/file --profile pname --exclude \"*\" --recursive]:
The mistake that you made is, you did not pass the bucket name correctly. You have to pass the S3Uri(s3://temporary-bucket-to-restore-website-files/) not the bucket ARN. Modify your command as given below, and it will work.
aws s3 cp temporary-bucket-to-restore-website-files/ folder/file --profile pname --exclude \"*\" --recursive
Ref: https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html
I hope this helps you!

Exclude folders for s3cmd sync

I am using s3cmd and i would like to know how to exclude all folders within a bucket and just sync the bucket root.
for example
bucket
folder/two/
folder/two/file.jpg
get.jpg
with the sync i just want it to sync the get.jpg and ignore the folder and its contents.
s3cmd --config sync s3://s3bucket (only sync root) local/
If someone could help that would be amazing i have already tried the --exclude but not sure how to use it in this situation?
You should indeed use the --exclude option. If you want to sync every file on the root but not the folders, you should try :
s3cmd --exclude="/*/*" sync local/ s3://s3bucket
Keep in mind that a folder doesn't really exist on S3. What seems to be a file file in a folder folder is just a file named folder/file! So you just have to exclude file with the pattern /*/*.
As mentioned by #physiocoder excluding a folder is done the following way:
s3cmd --exclude 'foldername/*'
So that is different from the question but I landed on this page due to its title.

Is it possible to sync a single file to s3?

I'd like to sync a single file from my filesystem to s3.
Is this possible or can only directories by synced?
Use include/exclude options for the sync-directory command:
e.g. To sync just /var/local/path/filename.xyz to S3 use:
s3 sync /var/local/path s3://bucket/path --exclude='*' --include='*/filename.xyz'
cp can be used to copy a single file to S3. If the filename already exists in the destination, this will replace it:
aws s3 cp local/path/to/file.js s3://bucket/path/to/file.js
Keep in mind that per the docs, sync will only make updates to the target if there have been file changes to the source file since the last run: s3 sync updates any files that have a size or modified time that are different from files with the same name at the destination. However, cp will always make updates to the target regardless of whether the source file has been modified.
Reference: AWS CLI Command Reference: cp
Just to comment on pythonjsgeo's answer. That seems to be the right solution but make sure so execute the command without the = symbol after the include and exclude tag. I was including the = symbol and getting weird behavior with the sync command.
s3 sync /var/local/path s3://bucket/path --exclude '*' --include '*/filename.xyz'
You can mount S3 bucket as a local folder (using RioFS, for example) and then use your favorite tool to synchronize file(-s) or directories.