Cloudron makes it easy to run web apps like WordPress, Nextcloud, GitLab on your server. Find out more or install now.


Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Bookmarks
  • Search
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo

Cloudron Forum

Apps - Status | Demo | Docs | Install
  1. Cloudron Forum
  2. Off-topic
  3. Fileferry CLI - For those who manage large media collections.

Fileferry CLI - For those who manage large media collections.

Scheduled Pinned Locked Moved Off-topic
1 Posts 1 Posters 813 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • robiR Offline
    robiR Offline
    robi
    wrote on last edited by
    #1

    https://github.com/dkarlovi/fileferry

    FileFerry — media organizer (short)

    FileFerry is a small CLI that organizes image and video files into target folders using metadata and filename patterns.

    What it does

    • Scan one or more source directories (profiles) for media files.
    • Extract metadata from filenames, EXIF (images) or ffprobe (videos) when available.
    • Render a per-profile target path template and move files (dry-run by default).

    Quick examples

    Build and dry-run with your config file:

    go build -o fileferry .
    ./fileferry config.yaml # dry-run: shows what would move
    ./fileferry config.yaml --ack # actually move files

    Example (anonymized) config.yaml excerpt:

    profiles:
    Videos:
    sources:
    - path: /path/to/videos
    recurse: true
    types: [video]
    patterns:
    - "{meta.taken.date} {meta.taken.time}.mkv"
    - "{meta.taken.date}-{meta.taken.time}.mkv"
    target:
    path: /organized/videos/{meta.taken.year}/{meta.taken.date}/{meta.taken.datetime}.{file.extension}

    Pictures:
    sources:
    - path: /path/to/pictures
    recurse: false
    types: [image]
    target:
    path: /organized/pictures/{meta.taken.year}/{meta.taken.date}/{meta.taken.datetime}.{file.extension}

    Config contract (short)

    • profiles is a map of profile names -> profile config.
    • A ProfileConfig contains: sources (list), optional patterns (filename patterns used to extract metadata), and target.path (template used to build destination path).
    • SourceConfig has path, recurse, types and optional filenames.

    Template variables

    • {meta.taken.year}, {meta.taken.date}, {meta.taken.datetime}
    • {meta.camera.maker}, {meta.camera.model}
    • {file.extension} (no leading dot)

    Notes: filename patterns are anchored and must match the filename exactly (e.g. 2025-06-02 15-21-02.mkv). Patterns support tokens like {meta.taken.date} and {meta.taken.time} which map to regex rules.

    Conscious tech

    1 Reply Last reply
    3

    Hello! It looks like you're interested in this conversation, but you don't have an account yet.

    Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

    With your input, this post could be even better 💗

    Register Login
    Reply
    • Reply as topic
    Log in to reply
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes


    • Login

    • Don't have an account? Register

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Bookmarks
    • Search