gzip tutti i file senza eliminarli


11

Devo decomprimere tutti i file in una directory separatamente inclusi tutti i file nelle sottodirectory senza eliminare in seguito gli originali. Quindi diciamo che ho index.html, voglio avere alla fine index.html.gzip AND index.html.

Sono in grado di decomprimere tutti i file nella mia directory tramite

gzip -r .

Ma voglio conservare anche i file originali.

È possibile?

Risposte:


9
find . -type f | \
while read -r x
do
  gzip -c "$x" > "$x.gz"
done

Il -cspinge il risultato allo stdout e mantiene la sola originale. Lo svantaggio è che è necessario trovare i file da soli. Per spostamenti più sofisticati, è possibile utilizzare find(1), tuttavia, come sopra: .ricerche a partire dalla directory corrente e -type frestituisce il nome di ogni file normale.


Perché *.*dentro ls?

@pooh: *.*corrisponde a tutti i file con nomi regolari e di solito nessuna directory. Certo, funziona solo nella maggior parte dei casi e di solito non se ne hai bisogno. Quindi utilizzare il findcomando
Boldewyn,

@Boldewyn: la domanda era di decomprimere tutti i file in una directory. ls *.*non sceglierà file come TODO .

lsNon è necessario a tutti : for x in *. Tuttavia, l'utilizzo finddovrebbe essere find . -type f | while read -r x.
In pausa fino a ulteriore avviso.

Risposta aggiornata. Grazie per l' -raccensione read.
Boldewyn,

5
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;

Puoi facilmente cambiarlo per includere ciò che vuoi comprimere ( -name '*.txt -or -name '*.htmlecc.) Anziché come adesso, escludendo alcuni file (già compressi, backup e file temporanei).

Gestisce bene anche gli spazi nel nome del file.

Passare gzipa echo gzipper i test. Oppure salta la parte -exec tutti insieme.

Modifica: Oh, ho dimenticato di dire che questo non controlla se <target>.gzesiste già. Questo può o meno essere un problema.

Edit2: Ok, eccoci con qualcosa che controlla il file esistente. Se ciò può essere desiderato. Perdonate l'onestà.

while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz";  fi  done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))

Il mio find-foo non è forse quello che potrebbe essere, potrebbe benissimo essere possibile saltare direttamente a find.


1
basta leggere quel -name prima di -type per evitare di chiamare stat su ogni file.

@Ben ha senso, un buon input! Per alberi di grandi dimensioni potrebbe essere evidente.
Plundra,

2

Basta aggiungere l'opzione -c, penso che dovrebbe funzionare


1
Questo probabilmente funziona solo quando si esegue la gzip di un singolo file alla volta.
its_me


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.