Restic: Tidak dapat menemukan dokumen untuk sintaks file yang dikecualikan

Dibuat pada 8 Jun 2017  ·  17Komentar  ·  Sumber: restic/restic

Sepertinya saya tidak dapat menemukan dokumen tentang bagaimana sintaks file pengecualian diuraikan.

yaitu apakah itu mendukung wildcard? ekspresi reguler? bagaimana membedakan antara file dan direktori? apakah awalan jalur diperlukan? dari mana (cwd/atau root?)?

Beberapa contoh:

.qiv-trash (directory that could be anywhere on the filesystem)
.DS_Store
lost+found/
._*
desktop.ini
Thumbs.db (file that could be anywhere on the filesystem)
.Trash-* (the asterisk could be any number, is it needed?)
.tmp$ (file ending in .tmp)
~$ (file ending in a tilde)
~/.cache/ (cache directory in user home dir, using tilde syntax)
/full/path/to/directory/.syncthing/index*
documentation wanted

Komentar yang paling membantu

Untuk menjawab beberapa pertanyaan Anda:

  • Semua pola diuji terhadap path lengkap dari file/dir yang akan disimpan
  • Jalur/pola relatif akan cocok di mana saja di bawah jalur yang akan disimpan
  • Saat ini tidak ada cara untuk membedakan antara file dan direktori, jadi --exclude foo akan mengecualikan semua file dan direktori bernama foo . Hal yang sama berlaku untuk --exclude foo/ .

Dari file pengecualian Anda:

  • ._* akan cocok dengan semua file dan direktori yang namanya dimulai dengan titik dan garis bawah
  • desktop.ini akan sama persis dengan semua file bernama desktop.ini . Jadi desktop.ini.bak tidak dikecualikan dan disimpan di snapshot.
  • .Trash-* tidak termasuk file/dir bernama .Trash- , .Trash-foobar , dll.
  • .tmp$ mengecualikan semua file/dir yang secara harfiah bernama .tmp$ , yaitu sebuah titik, diikuti oleh tmp , diikuti dengan tanda dolar. Tidak ada ekspansi regexp.
  • ~$ mengecualikan semua file/dir yang secara harfiah bernama tilde dollar. Untuk mengecualikan semua file/dir yang diakhiri dengan tilde, gunakan *~ .
  • ~/.cache mengecualikan direktori .cache di semua direktori yang disebut tilde. Untuk mengecualikan direktori cache hanya di direktori home Anda, gunakan $HOME/.cache (tilde tidak diperluas, variabel lingkungan, tetapi hanya dalam file yang dibaca melalui --exclude-file , di baris perintah shell mengembang keduanya).
  • /full/path/to/directory/.syncthing/index* mengecualikan semua hal dengan nama yang dimulai dengan index bawah /full/path/to/directory/.syncthing .

Semua 17 komentar

Hai, sudahkah kamu melihat

Pola menggunakan filepath.Glob secara internal, lihat filepath.Match untuk sintaks. Selain itu ** tidak termasuk subdirektori arbitrer. Variabel lingkungan dalam file pengecualian diperluas dengan os.ExpandEnv.

di https://github.com/restic/restic/blob/master/doc/manual.rst?

Saya pikir ini harus menjawab pertanyaan Anda.

Saya pergi ke dokumentasi di https://restic.readthedocs.io/en/latest/manual.html dan mencari pengecualian, di mana sayangnya tidak menyertakan contoh umum (atau referensi ke dokumentasi lain di manual.rst ) :/

Saya membaca golang doc dan saya pikir pengguna akhir (saya!) tidak akan tahu apa restic membandingkan pengecualian dengan internal - apakah itu jalur lengkap (mis. /home/me/blah) atau jalur dari repositori root (/ bla atau bla), atau relatif terhadap cwd (saya/bla ketika saya di / rumah)?

Terima kasih telah mengangkat masalah ini, saya pikir Anda memiliki poin yang valid. Manual harus menjelaskan filter pengecualian tanpa merujuk godoc.org, dan lebih banyak contoh diperlukan.

Untuk menjawab beberapa pertanyaan Anda:

  • Semua pola diuji terhadap path lengkap dari file/dir yang akan disimpan
  • Jalur/pola relatif akan cocok di mana saja di bawah jalur yang akan disimpan
  • Saat ini tidak ada cara untuk membedakan antara file dan direktori, jadi --exclude foo akan mengecualikan semua file dan direktori bernama foo . Hal yang sama berlaku untuk --exclude foo/ .

Dari file pengecualian Anda:

  • ._* akan cocok dengan semua file dan direktori yang namanya dimulai dengan titik dan garis bawah
  • desktop.ini akan sama persis dengan semua file bernama desktop.ini . Jadi desktop.ini.bak tidak dikecualikan dan disimpan di snapshot.
  • .Trash-* tidak termasuk file/dir bernama .Trash- , .Trash-foobar , dll.
  • .tmp$ mengecualikan semua file/dir yang secara harfiah bernama .tmp$ , yaitu sebuah titik, diikuti oleh tmp , diikuti dengan tanda dolar. Tidak ada ekspansi regexp.
  • ~$ mengecualikan semua file/dir yang secara harfiah bernama tilde dollar. Untuk mengecualikan semua file/dir yang diakhiri dengan tilde, gunakan *~ .
  • ~/.cache mengecualikan direktori .cache di semua direktori yang disebut tilde. Untuk mengecualikan direktori cache hanya di direktori home Anda, gunakan $HOME/.cache (tilde tidak diperluas, variabel lingkungan, tetapi hanya dalam file yang dibaca melalui --exclude-file , di baris perintah shell mengembang keduanya).
  • /full/path/to/directory/.syncthing/index* mengecualikan semua hal dengan nama yang dimulai dengan index bawah /full/path/to/directory/.syncthing .

Terima kasih @fd0

Jadi dengan "direktori saat ini", Anda tidak bermaksud direktori tempat saya berada ketika saya meluncurkan cadangan, tetapi direktori yang restic saat ini sedang memeriksa file (selain pengecualian yang dimulai dengan garis miring). Mengerti.

Perilaku untuk file dan direktori sedikit tidak terduga, saya harapkan --exclude foo/ untuk mencadangkan direktori tetapi bukan kontennya, sedangkan --exclude foo untuk mencadangkan keduanya. Tidak yakin mengapa, dari rsync saya kira.

Contoh saya melewatkan yang penting: spasi! Saya kira saya harus melarikan diri dari itu dan shell metakarakter dengan garis miring terbalik.

Saya akhirnya menyalin banyak dari yang ini: https://Gist.github.com/jult/e2eaedad6b9e29d95977fea0ddffae7d

Apakah komentar diperbolehkan dalam file pengecualian? Sunting: https://github.com/restic/restic/pull/916/commits/c796d84fca48feea91ca3e85fbf38e16f764a468 sepertinya hash adalah karakter komentar.

Ah, saya khawatir itu masih belum sepenuhnya benar. Saya akan menjelaskan bagaimana restic mengevaluasi pola pengecualian. Misalkan restic dijalankan oleh pengguna di direktori home-nya ( /home/user ) seperti ini:

$ restic backup --exclude='*.bak' --exclude='/home/user/secret' --exclude='extra' ~

Kemudian restic akan melihat argumen baris perintah berikut (setelah ekspansi oleh Shell):

["restic", "backup", "--exclude='*.bak'", "--exclude='/home/user/secret'", "--exclude='extra'", "/home/user"]

Kemudian, ia mulai melintasi /home/user . Daftar berikut menjelaskan apa yang terjadi ketika file/dir bernama terlihat. restic selalu menguji jalur lengkap terhadap pola:

  • file /home/user/foo.bak : Pola *.bak cocok dan file tidak disimpan. Polanya tidak mutlak sehingga cocok di mana saja untuk semua file yang berakhiran .bak .
  • dir /home/user/secret : Pola absolut /home/user/secret cocok, jadi dir tidak disimpan dan tidak dilalui
  • dir /home/user/foo/home/user/secret : Tidak ada pola yang cocok, jadi dir disimpan.
  • dir /home/user/work/extra : Pola extra cocok, dir tidak disimpan.

Saya harap ini sedikit lebih jelas sekarang, saya akan menambahkan bagian ke manual yang menjelaskan prosesnya. Poin utama yang dapat diambil adalah bahwa pola dievaluasi terhadap jalur lengkap file selama pencadangan. Jadi jika Anda ingin mencocokkan satu direktori, gunakan jalur lengkap, jika tidak, mungkin cocok beberapa kali di suatu tempat.

Ada pertanyaan lebih lanjut? :)

Saya memiliki pertanyaan lebih lanjut, dan saya sangat menghargai waktu yang Anda luangkan untuk menjawabnya. Ini benar-benar satu pertanyaan tentang penahan pola otomatis. Saya pikir saya bisa menebak jawabannya (kami mengandalkan jalur absolut yang cukup unik dan memberi kami perilaku yang kami inginkan), tetapi yang terbaik adalah bertanya dan memastikan.

Apakah pola absolut /home/user/secret cocok dengan /home/user/secret2 ? (Bagaimana jika Anda tidak menginginkannya?)
Apakah pola absolut /home/user/secret cocok dengan /home/user/somemount/home/user/secret ?

Dalam kedua kasus: Tidak, polanya tidak akan cocok.

Mengapa demikian? Sunting: Saya senang tidak, tetapi saya tidak mengerti mengapa demikian :)

Kode yang cocok dimodelkan setelah apa yang akan dilakukan shell: Jika Anda bertanya pada diri sendiri, jika file /home/user/secret2 ada, apa yang akan dicetak ls /home/user/secret (asalkan file secret tidak ada)?

Dalam istilah yang lebih formal: Jika pola dimulai dengan / itu mutlak dan pola harus cocok dengan awal string yang diuji, jadi pola /home/user/secret tidak cocok dengan /home/user/somemount[...] : Polanya bukan awalan dari string.

Anda dapat membayangkan sendiri bahwa pola dan jalur file keduanya dibagi menjadi komponen masing-masing:

  • /home/user/secret dipecah menjadi [ROOT, "home", "user", "secret"] dan file /home/user/somemount/home/user/secret dipecah menjadi [ROOT, "home", "user", "somemount", "home", "user", "secret"] . String ROOT digunakan dalam contoh ini untuk menandai direktori root. Anda dapat melihat bahwa polanya tidak terkandung dalam nama file.

    • Mari kita lihat file /home/user/secret2 , yang dibagi menjadi [ROOT, "home", "user", "secret2"] . Sekali lagi Anda dapat melihat bahwa polanya tidak terkandung dalam nama file.

  • Untuk file /home/user/secret/secret.txt , yang dipecah menjadi [ROOT, "home", "user", "secret", "secret.txt"] Anda dapat melihat bahwa polanya memang terdapat dalam nama file, tepat di awal: [ROOT, "home", "user", "secret", ...] , oleh karena itu polanya cocok dan file dikecualikan.
  • Katakanlah kita memiliki pola pengecualian relatif secret/secret.txt , yang dibagi menjadi ["secret", "secret.txt"] . Anda dapat melihat bahwa pola ini dapat ditemukan dalam daftar untuk file /home/user/secret/secret.txt , mulai dari offset 3: [ROOT, "home", "user", "secret", "secret.txt"] , sehingga polanya cocok.

Ketika Anda memiliki wildcard ( * , ? dan seterusnya) dalam komponen jalur, mereka juga diuji. Jadi untuk contoh pertama Anda, pola /home/user/secret* akan cocok dengan jalur /home/user/secret2 .

Semua contoh ini harus didokumentasikan dalam manual saya pikir.

Kena kau. Terima kasih.

Apakah pengecualian negatif dimungkinkan ala .gitignore?
katakanlah saya ingin mengecualikan semua konten dalam direktori bernama .meteor kecuali untuk direktori bersarang .meteor/local/db, dapatkah saya melakukan ini?

/etc/restic/tidak termasuk:
.meteor/ !.meteor/local/db
restic backup exclude-file=/etc/restic/excludes

Tidak, itu belum diterapkan.

Mendokumentasikan contoh sertakan/kecualikan dilacak di #396, saya menutup masalah ini di sini.

@ fd0 saya mencoba mengecualikan jalur seperti pekerjaan di bawah ini/ /pekerjaan/ /builds/**/archive untuk mengecualikan direktori arsip dari semua direktori apakah itu akan berfungsi. Dan saya memiliki beberapa jalur seperti ini yang perlu saya kecualikan, jika mungkin dapatkah Anda menyarankan saya cara terbaik untuk menangani jenis ini karena saya tidak dapat menemukan contoh untuk jenis seperti itu dalam dokumentasi

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

shibumi picture shibumi  ·  3Komentar

cfbao picture cfbao  ·  3Komentar

jpic picture jpic  ·  3Komentar

christian-vent picture christian-vent  ·  3Komentar

e2b picture e2b  ·  4Komentar