Streaming & dry-run

Stream bodies through stdin/stdout with no temp files, and use --dry-run to preview an operation before it runs.

upload --stdin reads the body from stdin; download --stdout writes it to stdout. No intermediate file, no extra copy. Metadata for stdout downloads is suppressed by default and only emitted to stderr when --verbose is set, so the byte stream stays clean.

--dry-run resolves the provider and prints the operation it would run, without making a network call. Handy as a sanity check inside an agent loop before letting it execute writes.

# Stream binary in/out without temp files
ffmpeg -i talk.mov -c copy -f mp4 - \
  | files --provider r2 --bucket talks upload 2026/q1/keynote.mp4 --stdin --content-type video/mp4

files --provider r2 --bucket talks download 2026/q1/keynote.mp4 --stdout \
  | ffprobe -i - 2>&1

# Plan before doing — useful as a sanity check inside an agent loop
files --provider s3 --bucket uploads --dry-run delete reports/q1.pdf
# → {"dryRun":true,"provider":"s3","action":"delete","key":"reports/q1.pdf"}

# Verbose adds stack traces to error output
files --provider s3 --bucket uploads --verbose head missing.txt