Unix direktori zip tetapi mengecualikan subdirektori spesifik (dan semua yang ada di dalamnya)

115

Saya mencoba zip direktori (di Unix via SSH) tapi saya perlu mengecualikan beberapa subdirektori (dan semua file dan direktori di dalamnya).

Sejauh ini saya punya ini:

zip -r myarchive.zip dir1 -x dir1/ignoreDir/**/* 

Tapi sepertinya itu tidak berhasil.

Saya juga mencoba

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/* dir1/ignoreDir2/*

Namun itu masih akan menyertakan subdirektori di dalam ignDir1 dan ignDir2.

Struktur subdirektori dalam direktori yang ingin saya kecualikan cukup besar sehingga saya tidak bisa begitu saja menambahkan setiap direktori ke argumen -x.

Adakah yang tahu bagaimana melakukan ini?

Sulman
sumber
@AlexanderMills - Lihat pertanyaan ini.
jww

Jawaban:

131

Saya sangat dekat!

Perintah aktual yang saya butuhkan adalah:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/**\* dir1/ignoreDir2/**\*
Sulman
sumber
Keren, dan terima kasih sudah menindaklanjutinya! Anda dapat menerima jawaban Anda sendiri.
Daniel H
2
Ini tidak berfungsi untuk saya di osx. @pathfilder menjawabnya.
rynop
11
Alih-alih ini: -x dir1 / ignDir1 / ** \ *, Anda dapat melakukan ini: -x dir1 / ignDir1 / \ *
Richard Gomes
67

Untuk sistem khusus saya untuk mengecualikan direktori saya harus memberi tanda kutip di sekitar direktori saya yang dikecualikan dan itu bekerja seperti pesona:

zip -r myarchive.zip dir1 -x "dir1/ignoreDir1/*" "dir1/ignoreDir2/*"

Catatan:

- ini mengecualikan direktori yang akan dikecualikan dan semua file di dalamnya.

- Anda harus menggunakan jalur lengkap ke direktori yang ingin Anda kecualikan!

pramuka
sumber
5
Ini adalah yang bekerja di Mac OS. :-)
physicalattraction
9
Karena tidak ada yang menjelaskan alasan meminta mengutip path atau melarikan diri dari asterisk, alasannya adalah: Jika path tidak dikutip atau wildcard lolos, shell akan melakukan ekspansi wildcard sebelum meneruskannya zip, yang akan menerima daftar jalur ke entri dalam direktori yang ditentukan, tetapi tidak jalur ke file dalam subdirektori dari mereka, sehingga menyebabkan ziptidak mengabaikan segala sesuatu di bawah direktori yang diberikan.
zagrimsan
Saya pikir pada awalnya salah satu alasan ini berhasil adalah karena pada Mac OS ada ruang di direktori saya dan ini dihindari memerlukan \
pathfinder
Terima kasih telah membereskan @zagrimsan. Keduanya memperbaiki masalah dan menjelaskan alasannya sehingga kami memahaminya (yang juga akan berguna di masa depan untuk hal-hal lain). 👍
Synetech
8

@sulman menggunakan:

     zip -r myarchive.zip dir1 -x dir1 / ignDir1 / ** \ * dir1 / ignDir2 / ** \ *

masih akan menyertakan direktori dir1 / ignDir1 / kosong di arsip zip, menggunakan:

     zip -r myarchive.zip dir1 -x dir1 / ignDir1 ** dir1 / ignDir2 **

akan melakukan triknya, Anda juga dapat menggunakan ** terkemuka untuk mencari di subfolder alih-alih hanya dir1

Gianluca P.
sumber
Ah baiklah! Terima kasih telah menjelaskan ini!
sulman
7

Berikut ini akan dilakukan

zip -r myarchive.zip dir1 -x dir1 / ignDir1 \ * dir1 / ignDir2 \ *

Untuk apa kau butuh **, @sulman?

Ini berfungsi seperti pesona bagi saya sebagai berikut:

[root@ip-00-000-000-000 dir1]# ls -lrt dir1/ 
total 16
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir1
drwxr-xr-x 2 root root 4096 Oct 31 07:38 ignoredir2
drwxr-xr-x 2 root root 4096 Oct 31 07:39 dir3
-rw-r--r-- 1 root root    8 Oct 31 07:39 test.txt

[root@ip-00-000-000-000 temp]# zip -r dir1.zip dir1 -x dir1/ignoredir1\* dir1/ignoredir2\*
  adding: dir1/ (stored 0%)
  adding: dir1/dir3/ (stored 0%)
  adding: dir1/dir3/test3.txt (deflated 13%)
  adding: dir1/test.txt (stored 0%)
ericn
sumber
Saya tidak tahu mengapa ** diperlukan. Mungkin orang lain bisa menjelaskan ini?
sulman
Maaf, @sulman, saya salah mengetik. Yang saya maksudkan adalah sesuai hasil edit terakhir saya. Bekerja seperti pesona bagi saya :)
ericn
1

Sama seperti jawaban lain, tetapi mengecualikan direktori sepenuhnya, alih-alih mengecualikan semua isi direktori:

zip -r myarchive.zip dir1 -x dir1/ignoreDir1/\* dir1/ignoreDir2/\*
Richard Gomes
sumber
0

Saya menemukan ini bekerja dari David R Heffelfinger :

zip -r myarchive.zip dir1 -x dir1/ignoreDir1\* dir1\ignorDir2\*

Itu mengecualikan direktori dan isinya.

Rick Ehrahrt
sumber
Tentunya garis miring terbalik antara dir1dan ignorDir2dimaksudkan sebagai garis miring ke depan. Apakah maksud Anda agar backslash yang lain menjadi backslash? Jika ya, maka Anda baru saja menyalin jawaban fuzzybee dari dua tahun lalu.
G-Man
-1

Bagi saya bekerja: zip -9 -r ~ / folded.zip online -x folder / folder2 / folder3 / foldern / \ * .

Tampaknya asterisk harus diloloskan.

Francisco M.
sumber
2
Bagaimana ini berbeda dari solusi oleh Rick Ehrahrt setahun yang lalu, atau Eric (beberapa tahun yang lalu)? Harap baca solusi yang disediakan sebelum memposting yang baru ...
zagrimsan
Karena saya menambahkan garis miring terbalik sebelum tanda bintang (yaitu untuk menghindari tanda bintang). Dalam versi linux di tempat kerja saya tidak berfungsi jika saya tidak melakukan itu.
Francisco M
Rick Ehrahrt (2014) dan eric (2012) juga memposting solusi yang sama (untuk menghindari asterisk). Tidak ada yang salah dengan solusinya, tetapi memposting yang sama berkali-kali tidak masuk akal kecuali seseorang dapat secara signifikan menambahkan kedalaman ke solusi dengan menjelaskan mengapa solusi itu bekerja. Dalam kasus sederhana seperti ini, tidak ada yang perlu dijelaskan lebih lanjut. Tolong jangan menganggap ini masalah pribadi, satu-satunya tujuan saya di sini adalah untuk membantu menjaga SU tetap bersih dan ringkas sehingga pengguna dapat menemukan solusi terbaik dengan sedikit usaha.
zagrimsan