borg-diff(1) borg backup tool borg-diff(1)

borg-diff - مقایسه تفاوت‌های دو بایگانی در Borg

borg [common options] diff [options] REPO::ARCHIVE1 ARCHIVE2 [PATH...]

این دستور تفاوت‌ها (محتوای پرونده، کاربر/گروه/دسترسی) بین بایگانی‌ها را می‌یابد.

یک مکان مخزن و یک نام بایگانی باید برای REPO::ARCHIVE1 مشخص شود. ARCHIVE2 فقط نام یک بایگانی دیگر در همان مخزن است (تعیین مکان مخزن مجاز نیست).

برای هر مورد منطبق در هر دو بایگانی، Borg گزارش می‌دهد:

  • تغییرات محتوا: مجموع بایت‌های افزوده/حذف شده در پرونده‌ها. اگر پارامترهای تکه‌ساز (chunker) قابل مقایسه باشند، Borg شناسه‌های تکه‌ها (chunk IDs) را به‌سرعت مقایسه می‌کند؛ در غیر این صورت، محتوا را مقایسه می‌کند.
  • تغییرات متادیتا: کاربر، گروه، دسترسی و سایر فراداده‌ها به‌صورت درون‌خطی مانند "[old_mode -> new_mode]" برای تغییرات دسترسی نمایش داده می‌شوند. برای جلوگیری از نمایش تغییرات متادیتا از --content-only استفاده کنید.
  • موارد افزوده/حذف شده: به‌صورت "added SIZE path" یا "removed SIZE path" چاپ می‌شوند.

خروجی پیش‌فرض (متنی) یک خط برای هر مسیر تغییریافته نمایش می‌دهد، مانند:

+135 B    -252 B [ -rw-r--r-- -> -rwxr-xr-x ] path/to/file

خروجی خطوط JSON با گزینه (--json-lines) یک شیء JSON برای هر مسیر تغییریافته چاپ می‌کند، مانند:

{"path": "PATH", "changes": [
    {"type": "modified", "added": BYTES, "removed": BYTES},
    {"type": "mode", "old_mode": "-rw-r--r--", "new_mode": "-rwxr-xr-x"},
    {"type": "added", "size": SIZE},
    {"type": "removed", "size": SIZE}
]}

تنها تغییرات واقعی در فهرست "changes" گنجانده می‌شوند. برای مثال، یک مدخل تغییریافته با added=0 و removed=0 نادیده گرفته می‌شود.

از --sort-by FIELDS استفاده کنید که در آن FIELDS فهرستی از فیلدها است که با کاما از هم جدا شده‌اند. مرتب‌سازی‌ها به‌صورت پایدار از آخرین به اولین مورد در فهرست داده‌شده اعمال می‌شوند. برای نزولی پیشوند ">" و برای صعودی "<" (یا بدون پیشوند) را اضافه کنید، برای مثال --sort-by=">size_added,path". فیلدهای پشتیبانی‌شده عبارتند از:

  • path: مسیر مورد
  • size_added: کل بایت‌های افزوده شده برای محتوای مورد
  • size_removed: کل بایت‌های حذف شده برای محتوای مورد
  • size_diff: size_added - size_removed (تغییر خالص محتوا)
  • size: اندازه مورد ذخیره‌شده در ARCHIVE2 (۰ برای موارد حذف شده)
  • user, group, uid, gid, ctime, mtime: در صورت وجود، از وضعیت مورد در ARCHIVE2 گرفته می‌شوند
  • ctime_diff, mtime_diff: اختلاف برچسب زمان (archive2 - archive1)

گزینه --sort منسوخ شده است و تنها بر اساس مسیر مرتب‌سازی می‌کند.

برای بایگانی‌های ایجاد شده با Borg 1.1 یا جدیدتر، diff به‌طور خودکار تشخیص می‌دهد که آیا بایگانی‌ها با پارامترهای تکه‌ساز (chunker) یکسان ایجاد شده‌اند یا خیر. اگر چنین باشد، تنها شناسه‌های تکه مقایسه می‌شوند که بسیار سریع است.

برای بایگانی‌های پیش از Borg 1.1، محتوای تکه‌ها به‌طور پیش‌فرض مقایسه می‌شود. اگر بایگانی‌ها را با پارامترهای تکه‌ساز متفاوتی ایجاد نکرده‌اید، --same-chunker-params را پاس دهید. توجه داشته باشید که پارامترهای تکه‌ساز از Borg 0.xx به 1.0 تغییر کرده‌اند.

برای راهنمایی بیشتر درباره الگوهای گنجاندن/مستثنی کردن، خروجی دستور borg_patterns را ببینید.

برای گزینه‌های مشترک دستورات Borg به borg-common(1) مراجعه کنید.

مکان مخزن و نام ARCHIVE1
نام ARCHIVE2 (تعیین مکان مخزن مجاز نیست)
مسیر موارد درون بایگانی‌ها برای مقایسه؛ از الگوها پشتیبانی می‌شود

منسوخ شده است، به‌جای آن از --numeric-ids استفاده کنید
تنها شناسه‌های عددی کاربر و گروه در نظر گرفته شوند
صرف‌نظر کردن از بررسی پارامترهای تکه‌ساز.
مرتب‌سازی خروجی بر اساس مسیر (منسوخ شده، از --sort-by=path استفاده کنید).
--sort-by FIELDS
مرتب‌سازی پیشرفته: تعیین فیلد(ها) برای مرتب‌سازی. یک فهرست جداشده با کاما را می‌پذیرد. برای نزولی با > یا برای صعودی (پیش‌فرض) با < پیشوندگذاری کنید.
تنها مقایسه تفاوت‌ها در محتوا (صرف‌نظر کردن از تفاوت‌های متادیتا)
قالب‌بندی خروجی به‌صورت خطوط JSON.

مستثنی کردن مسیرهای منطبق با PATTERN
خواندن الگوهای استثنا از EXCLUDEFILE، یک الگو در هر خط
گنجاندن/مستثنی کردن مسیرهای منطبق با PATTERN
خواندن الگوهای گنجاندن/استثنا از PATTERNFILE، یک الگو در هر خط

$ borg init -e=none testrepo
$ mkdir testdir
$ cd testdir
$ echo asdf > file1
$ dd if=/dev/urandom bs=1M count=4 > file2
$ touch file3
$ borg create ../testrepo::archive1 .
$ chmod a+x file1
$ echo "something" >> file2
$ borg create ../testrepo::archive2 .
$ echo "testing 123" >> file1
$ rm file3
$ touch file4
$ borg create ../testrepo::archive3 .
$ cd ..
$ borg diff testrepo::archive1 archive2
[-rw-r--r-- -> -rwxr-xr-x] file1
   +135 B    -252 B file2
$ borg diff testrepo::archive2 archive3
    +17 B      -5 B file1
added           0 B file4
removed         0 B file3
$ borg diff testrepo::archive1 archive3
    +17 B      -5 B [-rw-r--r-- -> -rwxr-xr-x] file1
   +135 B    -252 B file2
added           0 B file4
removed         0 B file3
$ borg diff --json-lines testrepo::archive1 archive3
{"path": "file1", "changes": [{"type": "modified", "added": 17, "removed": 5}, {"type": "mode", "old_mode": "-rw-r--r--", "new_mode": "-rwxr-xr-x"}]}
{"path": "file2", "changes": [{"type": "modified", "added": 135, "removed": 252}]}
{"path": "file4", "changes": [{"type": "added", "size": 0}]}
{"path": "file3", "changes": [{"type": "removed", "size": 0}]}
# استفاده از --sort-by با یک فهرست جداشده با کاما؛ مرتب‌سازی‌ها به‌صورت پایدار از آخر به اول اعمال می‌شوند.
# در اینجا: اولویت اصلی با تغییر خالص اندازه به‌صورت نزولی، برای موارد برابر بر اساس مسیر به‌صورت صعودی
$ borg diff --sort-by=">size_diff,path" testrepo::archive1 archive3
    +17 B      -5 B [-rw-r--r-- -> -rwxr-xr-x] file1
removed         0 B file3
added           0 B file4
   +135 B    -252 B file2

borg-common(1)

The Borg Collective

2026-07-18