A command line download/upload tool with resume.
Simplicity: download or upload files depending on parameter order with default settings.
Download a release for Linux or MacOS from releases. See the Docker section on how to run it platform-independently.
If you want to build from source, use:
cargo install aim| Protocol | Download | Upload | Resume | Interactive mode |
|---|---|---|---|---|
| http(s) | β | β | β | β |
| ftp | β | β | β | β |
| sftp | β | β | β | β |
| ssh | β | β | β | β |
| s3 | β | β | β | β |
- default action implied from parameter order.
aim https://domain.com/-> Display contents.aim https://domain.com/source.file .-> Download.aim source.file https://domain.com/destination.file-> Upload.
- support for
http(s),(s)ftp,ssh,s3(no resume at the moment).
To validate that a download matches a desired checksum, just list it at the end when invoking aim.
aim https://github.com/XAMPPRocky/tokei/releases/download/v12.0.4/tokei-x86_64-unknown-linux-gnu.tar.gz . 0e0f0d7139c8c7e3ff20cb243e94bc5993517d88e8be8d59129730607d5c631bPlease consult the Feature matrix to find out if transfers via your desired protocol are resumable.
Resumable transfers pick up from a specific byte offset and continue. Extensive testing ensures that transfers are byte-exact (hash comparison between expected and actual transfer artefacts).
Node: If you're hosting a http(s) server yourself, upload needs
PUTranges (or a patched version ofnginx).
This feature can be activated by passing the -i or --interactive flag to the invocation.
It allows you to specify an initial URL and then navigate through links found in it using fuzzy search.
Controls:
- Start typing, partial matches are listed.
Tabexpands the path and goes into it, lists contents./goes into path without expanding, lists contents...goes one level up.Enterfinalizes the interaction and takes the result, performs the required operation on it.
This feature can be used in conjunction with Output during downloading and/or Sharing a folder.
Several output formats can be specified:
aim source .- downloads to the same basename as the source.aim source +- downloads to the same basename as the source and attempts to decompress. Target extensions are read and the system decompressor is called. Further info here.aim source destination- download to a new or existing file calleddestination.
aim can serve a folder over http on one device so that you can download it on another. By default, the serving port is 8080 or the next free port.
You can optionally set the AIM_HOSTING_PORT environment variable in your shell or .env file for a specific port.
Machine A
aim . # to serve current folderMachine B
aim http://ip_of_Machine_A:8080 # list contents
aim http://ip_of_Machine_A:8080/file . # downloadMoreover, since hosting is done over http, the client can even be a browser:

The server prints logs to the standard output. To colorize them, you can use pipeview:
aim . | pipeview --aimBy default, a progressbar is displayed when up/downloading. The indicators can be configured via the internally used indicatif package.
You can change the display template and progress chars by either setting correct environment variables or creating a .env file in the folder you are calling from:
AIM_PROGRESSBAR_DOWNLOADED_MESSAGE="π― Downloaded {input} to {output}"
AIM_PROGRESSBAR_MESSAGE_FORMAT="π― Transferring {url}"
AIM_PROGRESSBAR_PROGRESS_CHARS="=>-"
AIM_PROGRESSBAR_TEMPLATE="{msg}\n{spinner:.cyan} {elapsed_precise} β{bar:.white}β {bytes}/{total_bytes} {bytes_per_sec} ETA {eta}."
AIM_PROGRESSBAR_UPLOADED_MESSAGE="π― Uploaded {input} to {output}"
AIM_HOSTING_PORT=8080By default, no progressbar is displayed if content length <1MB (easy display contents of remote).
Because default output is stdout, aim is pipe-able to other commands:
aim https://github.com/XAMPPRocky/tokei/releases/download/v12.0.4/tokei-x86_64-unknown-linux-gnu.tar.gz | tar xvz
aim https://www.rust-lang.org/ | htmlq --attribute href aJust use the syntax protocol://user:pass@server:port. This can be used for all http(s), ftp, ssh and s3.
Example for downloading:
aim ftp://user:[email protected]:21/myfile .Create a file named .netrc with read permissions in ~ or the current folder you're running aim from to automate login to that endpoint:
machine mydomain.com login myuser password mypass port server_portKeys that match the following patterns are automatically tried:
- id_ed25519
- id_rsa
- keys/id_ed25519
- keys/id_rsa
- ~/.ssh/id_rsa
- ~/.ssh/keys/id_ed25519
Credentials for AWS interaction (i.e.: S3) are automatically read from ~/.aws/credentials.
Alternatively, the AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables are read.
aim can self update in-place using:
aim --updateFor convenience, alpine-based docker images for aarch64 and x64 are available, so arguments can be passed directly to them.
docker run --rm -it -v $(pwd):/src --net=host --user $UID:$UID mihaigalos/aim https://raw.githubusercontent.com/mihaigalos/aim/main/LICENCE.mdcd $(mktemp -d)
echo hello > myfile
docker run --rm -it -v $(pwd):/src --user $UID:$UID -p 8080:8080 mihaigalos/aim /srcAdapt IP to match that of machine A.
docker run --rm -it -v $(pwd):/src --user $UID:$UID mihaigalos/aim http://192.168.0.24:8080/myfile /src/myfile
