Bagaimana cara menggunakan 7z untuk mengarsipkan semua file dan direktori (termasuk yang tersembunyi) dalam direktori?

10

Karena spesifik dari kebutuhan pengarsipan saya, saya tidak nyaman dengan arsip tar.gz solid dan menggunakan 7z sebagai gantinya.

Saya menggunakan perintah berikut untuk melakukan ini:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*

Untuk membuat arsip semua yang ada di dalamnya ~/my/folder/sebagai ~/my/folder.7zfile.

Tapi ~/my/folder/.hiddenFoldertidak masuk ke arsip itu. Bagaimana cara memperbaikinya? Bukankah *seharusnya mengembalikan semua file dan folder?

Ivan
sumber
Anda menggunakan perluasan bash path dengan yang terakhir *, coba hapus, 7z harus mengarsipkan seluruh direktori.
enzotib
@enzotib tapi saya tidak ingin direktori dalam arsip, hanya apa yang ada di dalamnya. Dan itu sebabnya saya menandai pertanyaan untuk bash- mungkin saya menggunakan "perluasan jalur bash" dengan cara yang salah?
Ivan

Jawaban:

8

Jika Anda ingin konten direktori tunggal, metode yang mudah adalah dengan mengubahnya terlebih dahulu:

cd ~/my/folder
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z .

Apa yang Anda lihat adalah yang *diperluas ke daftar nama file yang tidak dimulai dengan a .. Itu perilaku yang didokumentasikan, dan itu adalah alasan utama mengapa file yang namanya dimulai dengan .kata disembunyikan (yang lain adalah yang lstidak menunjukkannya secara default).

Tidak ada cara portabel yang benar-benar nyaman untuk membuat daftar semua file dalam direktori. Kamu bisa menggunakan

~/my/folder/..?* ~/my/folder/.[!.]* ~/my/folder/*

tetapi jika tidak ada file yang cocok dengan salah satu polanya maka polanya akan tetap tidak berkembang. Dalam bash, Anda dapat mengatur dotglobopsi untuk menghindari memperlakukan pemimpin .secara khusus ( .dan ..masih dikecualikan dari pertandingan):

shopt -s dotglob
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*

Di ksh, atau dalam bash jika Anda mengatur extglobopsi (atau di zsh jika Anda mengatur ksh_globopsi), Anda dapat menulis pola yang cocok dengan semua file kecuali .dan ..:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/@(..?*|.[!.]*|*)

Di zsh, ada cara sederhana untuk mengatakan yang .tidak harus diperlakukan secara khusus dalam sebuah pola:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*(D)
Gilles 'SANGAT berhenti menjadi jahat'
sumber
9

TL; DR

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/.

Lebih banyak contoh

Contoh struktur direktori

test1
├── .hidden
└── normal.txt

0 directories, 2 files

Coba ikuti perintah

  1. Root folder dengan semua isinya.

    7za a test1_a.7z ~/test1/

    memberi

        Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51 D....            0            0  test1
    2017-08-06 09:23:44 ....A            0            0  test1/.hidden
    2017-08-06 09:23:51 ....A            0            0  test1/normal.txt
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51                  0            0  2 files, 1 folders
  2. Tidak ada folder root dan tidak ada file tersembunyi

    7za a test1_b.7z ~/test1/*

    memberi

       Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51 ....A            0            0  normal.txt
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51                  0            0  1 files
  3. Tidak ada folder root tetapi file tersembunyi disertakan (ini yang biasanya kami inginkan)

    7za a test1_c.7z ~/test1/.

    memberi

       Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:44 ....A            0            0  .hidden
    2017-08-06 09:23:51 ....A            0            0  normal.txt
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51                  0            0  2 files
stil
sumber
Ya hanya menguji ini dan itu jauh lebih rapi daripada menggunakan shopt.
akan
Jawaban terbaik di sini. Terima kasih.
Marcin
4

Tidak, *tidak seharusnya mengembalikan semua file. Hanya mengembalikan yang terlihat.

Solusi yang lebih mudah adalah:

cd ~/my/folder
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z .
andcoz
sumber