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*
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:
--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 bawahdesktop.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:
/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
./home/user/secret
: Pola absolut /home/user/secret
cocok, jadi dir tidak disimpan dan tidak dilalui/home/user/foo/home/user/secret
: Tidak ada pola yang cocok, jadi dir disimpan./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./home/user/secret2
, yang dibagi menjadi [ROOT, "home", "user", "secret2"]
. Sekali lagi Anda dapat melihat bahwa polanya tidak terkandung dalam nama 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.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
Komentar yang paling membantu
Untuk menjawab beberapa pertanyaan Anda:
--exclude foo
akan mengecualikan semua file dan direktori bernamafoo
. 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 bawahdesktop.ini
akan sama persis dengan semua file bernamadesktop.ini
. Jadidesktop.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 olehtmp
, 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 denganindex
bawah/full/path/to/directory/.syncthing
.