dvs status reports each tracked file as current (on disk and matching the stored hash), absent (tracked but missing on disk), or unsynced (on disk but not matching the stored hash). By default it prints a compact table.

Usage: dvs status [OPTIONS] [PATHS]...

Arguments:
  [PATHS]...  Paths (files or directories) to check status for

Options:
      --json               Output results as JSON
  -r, --recursive          Recurse into subdirectories of given directories
      --current            Include current files
      --absent             Include absent files
      --unsynced           Include unsynced files
      --with-metadata      Show all metadata columns
      --threads <THREADS>  Threads (0 = auto-detect)
  -h, --help               Print help

🔗Options

FlagArgumentDefaultBehavior
[PATHS]...pathswhole projectFiles or directories to report.
-r, --recursiveflagoffInclude files in subdirectories of given directories.
--currentflagoffInclude current files.
--absentflagoffInclude absent files.
--unsyncedflagoffInclude unsynced files.
--with-metadataflagoffAdd hash, created_by, add_time, compression, message columns.
--threadsinteger0 (auto)Thread pool size for this command.
--jsonflagoffEmit results as JSON.

The three status flags are independent booleans and combine. With none set, all statuses are shown.

🔗Setup

Add three files, then delete one and edit another so all three states appear.

options(width = 1000)
library(here)
here() starts at /Users/elea/Documents/a2ai_github/dvs2-demo-repo
proj    <- here::here(basename(tempfile(fileext = "_project")))
storage <- here::here(basename(tempfile(fileext = "_storage")))
dir.create(proj)
dir.create(storage)
dir.create(file.path(proj, "data", "sub"), recursive = TRUE)
write.csv(mtcars[1:8, ],   file.path(proj, "data", "f1.csv"))
write.csv(mtcars[9:16, ],  file.path(proj, "data", "f2.csv"))
write.csv(iris[1:10, ],    file.path(proj, "data", "sub", "f3.csv"), row.names = FALSE)
Sys.setenv(DVS_PROJECT = proj, DVS_STORAGE = storage)
cd "$DVS_PROJECT"
dvs init "$DVS_STORAGE" >/dev/null
dvs add data/f1.csv data/f2.csv data/sub/f3.csv >/dev/null
rm data/f2.csv                      # -> absent
echo "extra,row" >> data/f1.csv     # -> unsynced

🔗All files

With no arguments and no filters, every tracked file is reported.

cd "$DVS_PROJECT"
dvs status
+-----------------+----------+-------+
| path            | status   | size  |
+-----------------+----------+-------+
| data/f1.csv     | unsynced | 488 B |
+-----------------+----------+-------+
| data/f2.csv     | absent   | 500 B |
+-----------------+----------+-------+
| data/sub/f3.csv | current  | 312 B |
+-----------------+----------+-------+

🔗Paths

Scope the report to specific files or directories.

cd "$DVS_PROJECT"
dvs status data/sub/f3.csv
+-----------------+---------+-------+
| path            | status  | size  |
+-----------------+---------+-------+
| data/sub/f3.csv | current | 312 B |
+-----------------+---------+-------+

🔗-r, --recursive

Without -r, a directory argument reports only files directly in it. With -r, files in subdirectories are included too.

cd "$DVS_PROJECT"
dvs status data
+-------------+----------+-------+
| path        | status   | size  |
+-------------+----------+-------+
| data/f1.csv | unsynced | 488 B |
+-------------+----------+-------+
| data/f2.csv | absent   | 500 B |
+-------------+----------+-------+
cd "$DVS_PROJECT"
dvs status data -r
+-----------------+----------+-------+
| path            | status   | size  |
+-----------------+----------+-------+
| data/f1.csv     | unsynced | 488 B |
+-----------------+----------+-------+
| data/f2.csv     | absent   | 500 B |
+-----------------+----------+-------+
| data/sub/f3.csv | current  | 312 B |
+-----------------+----------+-------+

🔗Status filters

Each filter alone:

cd "$DVS_PROJECT"
dvs status --current
+-----------------+---------+-------+
| path            | status  | size  |
+-----------------+---------+-------+
| data/sub/f3.csv | current | 312 B |
+-----------------+---------+-------+
cd "$DVS_PROJECT"
dvs status --absent
+-------------+--------+-------+
| path        | status | size  |
+-------------+--------+-------+
| data/f2.csv | absent | 500 B |
+-------------+--------+-------+
cd "$DVS_PROJECT"
dvs status --unsynced
+-------------+----------+-------+
| path        | status   | size  |
+-------------+----------+-------+
| data/f1.csv | unsynced | 488 B |
+-------------+----------+-------+

Filters combine:

cd "$DVS_PROJECT"
dvs status --absent --unsynced
+-------------+----------+-------+
| path        | status   | size  |
+-------------+----------+-------+
| data/f1.csv | unsynced | 488 B |
+-------------+----------+-------+
| data/f2.csv | absent   | 500 B |
+-------------+----------+-------+

🔗--with-metadata

By default the table shows path, status, and size. --with-metadata adds the hash, creator, add time, compression, and message columns.

cd "$DVS_PROJECT"
dvs status --with-metadata
+-----------------+----------+-------+------------------------------------------------------------------+------------+-----------------------------+-------------+---------+
| path            | status   | size  | hash                                                             | created_by | add_time                    | compression | message |
+-----------------+----------+-------+------------------------------------------------------------------+------------+-----------------------------+-------------+---------+
| data/f1.csv     | unsynced | 488 B | 5e2c49dd5c8a24a2ffe102e42804812c7eabc2c49682240480558eac390c5d65 | elea       | 2026-06-16T16:36:11.887408Z | zstd        |         |
+-----------------+----------+-------+------------------------------------------------------------------+------------+-----------------------------+-------------+---------+
| data/f2.csv     | absent   | 500 B | c9c0ca2ba19bf1d65159ba2b7300c3336fdf113c92b79901e06be4b40fcd8871 | elea       | 2026-06-16T16:36:11.887448Z | zstd        |         |
+-----------------+----------+-------+------------------------------------------------------------------+------------+-----------------------------+-------------+---------+
| data/sub/f3.csv | current  | 312 B | 881b133ef44731569b7844e1dc60f10e5fc4a9f2c2ac36fe20b2bba636d6bbce | elea       | 2026-06-16T16:36:11.887349Z | zstd        |         |
+-----------------+----------+-------+------------------------------------------------------------------+------------+-----------------------------+-------------+---------+

🔗--threads

Override the auto-detected thread count for this command.

cd "$DVS_PROJECT"
dvs status --threads 2
+-----------------+----------+-------+
| path            | status   | size  |
+-----------------+----------+-------+
| data/f1.csv     | unsynced | 488 B |
+-----------------+----------+-------+
| data/f2.csv     | absent   | 500 B |
+-----------------+----------+-------+
| data/sub/f3.csv | current  | 312 B |
+-----------------+----------+-------+

🔗--json

JSON output always includes the full metadata, regardless of --with-metadata.

cd "$DVS_PROJECT"
dvs status --json
[{"path":"data/f1.csv","status":"unsynced","metadata":{"hashes":{"blake3":"5e2c49dd5c8a24a2ffe102e42804812c7eabc2c49682240480558eac390c5d65"},"size":488,"created_by":"elea","add_time":"2026-06-16T16:36:11.887408Z","compression":"zstd"}},{"path":"data/f2.csv","status":"absent","metadata":{"hashes":{"blake3":"c9c0ca2ba19bf1d65159ba2b7300c3336fdf113c92b79901e06be4b40fcd8871"},"size":500,"created_by":"elea","add_time":"2026-06-16T16:36:11.887448Z","compression":"zstd"}},{"path":"data/sub/f3.csv","status":"current","metadata":{"hashes":{"blake3":"881b133ef44731569b7844e1dc60f10e5fc4a9f2c2ac36fe20b2bba636d6bbce"},"size":312,"created_by":"elea","add_time":"2026-06-16T16:36:11.887349Z","compression":"zstd"}}]

🔗Differences from R

The R function is dvs_status(). It always returns the metadata columns as a data frame, so there is no --with-metadata toggle; select columns instead. Its filters are a single status character vector (c("current", "absent", "unsynced")) rather than independent flags, and it has no --threads or --json.

🔗See also