Saya ingin mencadangkan semua 'dotfiles' (fe .zshrc
) di bawah direktori home saya dengan tar , tetapi tidak termasuk struktur direktori dan semua subdirektori.
Saya sudah mencobanya beberapa kali dengan perintah yang berbeda, tetapi yang terbaik yang saya raih adalah arsip yang menyertakan direktori tersembunyi $HOME
juga.
#!/bin/zsh
BACKUPFILE=dotfile_backup.tar.gz
tar --create --file=$HOME/$BACKUPFILE --auto-compress --no-recursion --exclude=. --exclude=.. --exclude=*/ --directory=$HOME .*
Saya juga berpikir tentang menggunakan find
dan menyalurkan hasilnya ke tar, tetapi tidak berhasil. Apakah ada yang tahu bagaimana mencapai ini - tampaknya - tugas mudah?
PS: Sebagian besar waktu ketika saya menggunakan tar untuk membuat arsip, saya harus berpikir tentang komik xkcd:
:)
*(.)
- dan saya pikir itu mengecualikan.
dan..
dari.*
default (dan mereka tidak akan diambil oleh.*(.)
, karena hanya memilih file). Saya tidak menggunakan zsh sendiri, jadi saya tidak cukup yakin untuk mengubahnya menjadi jawaban.Jawaban:
Anda dapat menggunakan perintah ini untuk membuat cadangan semua dotfile Anda (
.<something>
) di$HOME
direktori Anda :regex hanya menggunakan tar?
metode # 1
Saya meneliti ini sedikit dan muncul kosong. Faktor pembatas adalah bahwa ketika
tar
melakukan itu tidak termasuk, garis miring (/
) yang muncul dengan direktori bukan bagian dari persamaan ketika tar melakukan pencocokan polanya.Ini sebuah contoh:
Varian ini termasuk pengecualian
.*/
dan Anda dapat melihat dengan saklar verbose dihidupkan ke tar-v
,, bahwa direktori ini melewati pengecualian itu.metode # 2
Saya pikir mungkin saklar
--no-wildcards-match-slash
atau--wildcards-match-slash
akan bersantai keserakahan.*/
tapi ini tidak berpengaruh juga.Mengambil slash dari pengecualian,
.*
juga bukan pilihan karena itu akan memberitahutar
untuk mengecualikan semua dotfiles dan dotdirectories:metode # 3 (Jelek!)
Jadi satu-satunya alternatif lain yang bisa saya bayangkan adalah menyediakan daftar file
tar
. Sesuatu seperti ini:Pendekatan ini memiliki masalah jika jumlah file melebihi jumlah maksimum ruang untuk meneruskan argumen ke perintah akan menjadi masalah yang mencolok. Yang lain adalah bahwa itu jelek dan terlalu rumit.
jadi apa yang kita pelajari?
Tampaknya tidak ada cara yang mudah dan elegan untuk menyelesaikan ini menggunakan
tar
& ekspresi reguler. Jadi untuk komentar @ terdon,find ... | tar ...
benar-benar cara yang lebih tepat untuk melakukan ini.sumber
regex
, tetapi saya seharusnya tahu bahwa itu tidak akan bekerja seperti itu :)regex
Anda mungkin perlu untuk melarikan diri dari titik terkemuka dan akan mengalami kesulitan mengabaikan.
dan..
. Saya yakin itu mungkin karena slm mungkin akan menunjukkan tetapi saya tidak melihat mengapa itu akan bermanfaat.find
perintah dapat diteruskan sebagai argumentar
. The{}
mengatakan di mana Anda ingin hasil yang masuk sesuai-exec
perintah. Kata+
mengatakan untuk menambahkan sebanyak mungkin hasilfind
sesuai pada baris perintah dan memanggiltar
hanya beberapa kali daripada setiap kali ditemukan hasil.regex
dantar
karena tidak ada cara untuk mengisolasi direktori dot (.blah/
). Tar tidak menggunakan garis miring trailing saat melakukan pengecualian.Jenis kontrol atas file yang cocok jauh di luar zona kenyamanan tar. Aturannya untuk mencocokkan file terbatas pada kecocokan sederhana atas nama.
find
adalah satu arah, tetapi karena Anda memiliki zsh, Anda membuatnya lebih mudah:Bahwa
.
dalam tanda kurung pada akhir ekspresi wildcard adalah kualifikasi glob yang mengatakan "hanya cocok dengan file biasa".Tautan simbolis ke file biasa tidak cocok. Jika Anda mengubahnya
.*(-.)
, mereka akan dimasukkan, tetapi file tidak akan berakhir di arsip kecuali jika itu juga disertakan. Jika Anda ingin mengganti tautan simbolik dengan targetnya, buat itu.*(-.:A)
-:A
menambahkan pengubah perluasan riwayat yang menyelesaikan semua tautan simbolik ke jalur yang tidak menggunakan tautan simbolik.sumber
Jawaban ini didasarkan pada slm, tetapi saya juga akan menunjukkan kepada Anda bagaimana memasukkan direktori yang dimulai dengan
.
Untuk zip file dot di direktori home Anda:
Untuk memasukkan direktori:
Ini
?
opsional di perintah pertama, tetapi tidak di perintah kedua, jika tidak,find
akan menyertakan.
direktori (saat ini).sumber
bagaimana dengan:
sumber