Come creare una zip con più file senza sottocartelle?


12

Situazione iniziale:

.
├── d0
├── f0
├── f1
│   └── d1
└── f2
    └── f3
        ├── d2
        ├── d3
        └── d4

Cosa devo fare:

Vorrei creare uno zip contenente d0, d1 e d4 che deve avere la struttura a maggese:

.
├── d0
├── d1
└── d4

Quello che ho già provato:

L'ho provato con zip myfiles d0 f1/d1 f2/f3/d4. Ma questo mantiene la struttura delle cartelle originale, che non è quello che voglio.

.
├── d0
├── f1
│   └── d1
└── f2
    └── f3
        └── d4

Domanda Come creare una zip con più file senza le sottocartelle?

Risposte:


17

Manualmente, puoi creare il file zip e aggiornarlo:

zip myfiles d0
(cd f1; zip -u ../myfiles.zip d1)
(cd f2/f3; zip -u ../../myfiles.zip d4)

Le parentesi creano sottotitoli e l'effetto cddell'unica dura nella sottostruttura, quindi non è necessario cdtornare alla directory originale.

Se d1, d2ecc. Sono effettivamente file e non directory stesse, utilizzare l' -jopzione:

-j
--junk-percorsi
Memorizza solo il nome di un file salvato (junk il percorso) e non memorizza i nomi delle directory. Per impostazione predefinita, zip memorizzerà il percorso completo (relativo alla directory corrente).


19

È possibile utilizzare findper ottenere l'elenco dei file ed eseguire zip -j myfilesper comprimerli ignorando i percorsi:

find . -name "d[014]" -exec zip -j myfiles {} +

Esempio

$ tree
.
├── d0
├── f0
├── f1
│   └── d1
└── f2
    └── f3
        ├── d2
        ├── d3
        └── d4

$ find . -name "d[014]" -exec zip -j myfiles {} +
  adding: d1 (stored 0%)
  adding: d4 (stored 0%)
  adding: d0 (stored 0%)

$ unzip -l myfiles.zip
Archive:  myfiles.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-10-09 10:47   d1
        0  2017-10-09 10:48   d4
        0  2017-10-09 10:47   d0
---------                     -------
        0                     3 files

Tuttavia, questo funziona solo per i file , le directory verranno ignorate da zip -j. Per farlo funzionare anche per le directory, diciamo che vogliamo comprimere d0, d1e l'intera f3directory nell'esempio sopra, la findlinea diventa un po 'più complicata:

$ find . \( -name "d[01]" -o -name "f3" \) -exec sh -c 'p=$(pwd); for i in $0 $@; do cd ${i%/*}; zip -ur "$p"/myfiles ${i##*/}; cd "$p"; done' {} +
        zip warning: /home/dessert/myfiles.zip not found or empty
  adding: d1 (stored 0%)
  adding: f3/ (stored 0%)
  adding: f3/d3 (stored 0%)
  adding: f3/d2 (stored 0%)
  adding: f3/d4 (stored 0%)
  adding: d0 (stored 0%)
$ unzip -l myfiles.zip 
Archive:  myfiles.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-10-11 10:18   d1
        0  2017-10-11 10:19   f3/
        0  2017-10-11 10:19   f3/d3
        0  2017-10-11 10:19   f3/d2
        0  2017-10-11 10:19   f3/d4
        0  2017-10-11 10:17   d0
---------                     -------
        0                     6 files

18

L'uso dell'opzione -j rimuoverà il percorso dal file.

zip -j myfiles d0 f1/d1 f2/f3/d4 

riferimento


se uno dei percorsi che stai attraversando non sono file ma sono directory, tali directory non verranno aggiunte al zipfile con l' -jopzione.
Dan,

@dan - se vuoi tutti i file in una directory senza il percorso allorazip -j myfiles directory/*
ravery
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.