Last updated: Feb 26, 2024
Reading time·5 min

Use the s3 cp command with the --recursive parameter to download an S3
folder to your local file system.
The s3 cp command takes the S3 source folder and the destination directory
as inputs and downloads the folder.
Create a folder on your local file system where you'd like to store the downloads from the bucket, open your terminal in that directory and run the s3 cp command.
Let's set the --dryrun parameter to run the command in test mode to verify
everything looks good.
aws s3 cp s3://YOUR_BUCKET/YOUR_FOLDER . --recursive --dryrun

The output of the dry run command shows that everything works as expected.
Now let's run the s3 cp command in real mode to download the contents of the
S3 folder to our local file system.
aws s3 cp s3://YOUR_BUCKET/YOUR_FOLDER . --recursive

YOUR_BUCKET and YOUR_FOLDER placeholders with the bucket and directory names.We set the --recursive parameter in the command. It makes the s3 cp command
applicable to all files under the specified directory.
The . character signifies that the destination of the downloads is the current
directory.
Set the --include and --exclude parameters when running the cp command
to filter the files that are downloaded to your local file system from a
bucket.
The default behavior is that all files in the folder are included. For example,
to exclude all files with a .jpg extension from being downloaded, run the
following command.
aws s3 cp s3://YOUR_BUCKET/YOUR_FOLDER . --recursive --exclude "*.jpg"

We can also exclude an entire directory from being downloaded.
aws s3 cp s3://YOUR_BUCKET/YOUR_FOLDER/ . --recursive --exclude "movies/*"
The command excludes all files located in the movies/ directory, e.g.
movies/movie-1.mp4 and movies/movie-2.mp5.
Conversely, to only download .txt files, we have to exclude everything and
include only files with the .txt extension.
aws s3 cp s3://YOUR_BUCKET/YOUR_FOLDER/ . --recursive --exclude "*" --include "*.txt"

Note that the order is important when setting both the --exclude and
--include parameters.
The filters that appear later in the command have higher precedence. For
instance, the following command excludes all files because the --exclude
parameter overrides --include.
aws s3 cp s3://YOUR_BUCKET/YOUR_FOLDER/ . --recursive --include "*.jpg" --exclude "*"
However, if we specify the --include parameter second, we would download all
.jpg files from the specified directory.
aws s3 cp s3://YOUR_BUCKET/YOUR_FOLDER/ . --recursive --exclude "*" --include "*.jpg"
Lastly, we can set the --exclude and --include parameters as many times as
necessary.
For instance, the following command downloads all .jpg and .png files from
the S3 Bucket.
aws s3 cp s3://YOUR_BUCKET/YOUR_FOLDER/ . --recursive --exclude "*" --include "*.jpg" --include "*.png"
To download an entire bucket to your local file system, use the AWS CLI sync
command, passing it the S3 Bucket as a source and a directory on your file
system as a destination, e.g. aws s3 sync s3://YOUR_BUCKET ..
The sync command recursively copies the contents of the source to the destination.
Let's first run the sync command in test mode by setting the --dryrun
parameter. This demonstrates which files and directories would be downloaded to
the local file system once the command is run.
aws s3 sync s3://YOUR_BUCKET . --dryrun

YOUR_BUCKET placeholder, otherwise, you would get an AccessDenied error.The . character signifies the current directory. Create a directory that will
store the files and folders of the S3 bucket and navigate to it before running
the sync command in real mode.
Let's run the sync command to download all of the files and folders of the S3
bucket to the current directory on the local file system.
aws s3 sync s3://YOUR_BUCKET .

To filter the files that are downloaded from the bucket to the local file
system, make use of the --include and --exclude parameters when running the
sync command, e.g.
aws s3 sync s3://YOUR_BUCKET . --quiet --exclude "*.png".
By default, all files are included. To exclude all .png images from the
downloaded files, run the following command:
aws s3 sync s3://YOUR_BUCKET . --quiet --exclude "*.png"

The command downloads all of the bucket's files, except for files with the
.png extension.
We also used the --quiet parameter to suppress the sync command's output.
--quiet parameter would also suppress any errors the command throws, which can be confusing and hard to debug.We can also exclude an entire directory from being downloaded.
aws s3 sync s3://YOUR_BUCKET . --exclude "images/*"
We excluded all of the files located in the images/ folder, e.g.
images/cat.jpg, images/dog.png, etc.
Conversely, to download only .pdf files to the local file system, you would
exclude everything and include only files with the .pdf extension.
aws s3 sync s3://YOUR_BUCKET . --exclude "*" --include "*.pdf"

Note that the order is important when specifying both the --exclude and
--include parameters.
Filters that appear later in the command have higher precedence. For example,
the following command excludes all files because the --exclude parameter
overrides --include.
aws s3 sync s3://YOUR_BUCKET . --include "*.png" --exclude "*"
However, if we specify the --include parameter second, we would download all
.png images to our local file system:
aws s3 sync s3://YOUR_BUCKET . --exclude "*" --include "*.png"
Lastly, you can set the --exclude and --include parameters as many times as
necessary. For example, the following command downloads all .txt and .pdf
files from the bucket to the local file system.
aws s3 sync s3://YOUR_BUCKET . --exclude "*" --include "*.txt" --include "*.pdf"
You can learn more about the related topics by checking out the following tutorials: