Comprimi ogni file in una directory nel suo file compresso


24

Come posso comprimere ogni file in una directory nel suo tar mantenendo il nome per ogni file?

cioè file1.out file2.out

->

file1.out.tar.gz file2.out.tar.gz

Risposte:


64

Mettere ogni file in un file tar separato non ha alcun senso in questo scenario. Puoi usarli gzipper comprimerli direttamente:

gzip *

comporterà file1.out.gz, file2.out.gzecc.

Utilizzeresti tarsolo se avessi bisogno di un archivio compresso come un singolo file.

Se hai bisogno di un archivio tar per ogni file, puoi crearlo in questo modo:

for i in *; do tar -czf $i.tar.gz $i; done

7
+1: non esiste alcun motivo per creare un tar (Tape ARchive) per un singolo file. Basta comprimere ciò che si desidera comprimere: il risultato sarà leggermente più piccolo e avrà infinitamente più senso per le persone che estraggono i file.
voretaq7,

Per tarare ogni singola sottodirectory (solo un livello di profondità) e rimuovere l'originale:find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
xb.

(non riesco a modificare il mio commento sopra dopo 5 minuti) Una versione più semplice / sicura:find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
xb.

9

Per costruire sulla risposta di @ SvenW (che funzionerà solo sulla directory corrente), se hai un numero ENORME di file o vuoi farlo su una struttura di directory ricorsiva puoi anche usare

find . -type f -exec gzip \{\} \;

e se devi inserire l'output in una directory diversa (in questo esempio ../target) e non vuoi rimuovere gli originali, puoi fare qualcosa del tipo:

find . -type f -print | while read fname ; do
    mkdir -p "../target/`dirname \"$fname\"`"
    gzip -c "$fname" > "../target/$fname.gz"
done

1
find . -type f -exec gzip {} \;sarà sufficiente. Il secondo codice fallirà con nomi di file contenenti spazi e simili.
utente sconosciuto

Ad alcune shell non piacciono le {} s, e la seconda fa qualcosa di nettamente diverso dalla prima (ed ero consapevole dei problemi di spaziatura, ma è un po 'difficile da affrontare).
soffice

Se conosci una simile shell, ti invito a rispondere alla mia domanda qui: unix.stackexchange.com/questions/8647/… . Nessuno è stato in grado di nominare qualcosa che è oggi in uso finora. Se sei consapevole del rischio della tua risposta, potrebbe essere una buona idea nominarla nella tua risposta.
utente sconosciuto

@userunknown Sono stato educato su (t) csh, che ha avuto un sacco di problemi con parentesi graffe senza escape in una volta, anche se non sembra più (ma sfuggo ancora {}come una forza dell'abitudine). Altri hanno già pubblicato quelli come risposte alla tua domanda, tuttavia.
soffice

Oppure, per comprimere tutti i file non binari:find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
xb.

0

Prova questo:

#!/bin/bash
for fich in *; do
    if [ "$fich" != "*" ] ; then
        gzip -9 -c $fich > $fich.tar.gz
        \mv $fich.tar.gz $fich
    fi
done
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.