Linux gzip più sottodirectory in archivi separati?


16

Come potrei comprimere le sottodirectory in archivi separati?

Esempio:

directory
 subdir1
 subdir2

Dovrebbe creare subdir1 (.tar) .gz e subdir2 (.tar) .gz

Risposte:


27

Questo piccolo script sembra essere la migliore opzione, dati i tuoi requisiti:

cd directory
for dir in */
do
  base=$(basename "$dir")
  tar -czf "${base}.tar.gz" "$dir"
done

Gestisce correttamente le directory con spazi nei loro nomi.


Mi dà questo errore: bash: -c: riga 1: errore di sintassi: fine imprevista del file
EarthMind

@EarthMind: funziona benissimo qui. Controlla se lo script è stato copiato correttamente.
Juliano,

@EarthMind: Non sono sicuro che tu abbia spiegato bene la domanda originale, allora. Vuoi eseguirlo di nuovo e ottenere nuovi file .tar.gz lasciando soli i precedenti file .tar.gz? Prova ad aggiungere "tmstamp = $ (date '+% Y% m% d-% H% M')" e cambia $ {base} in $ {base} - $ {tmstamp}.
Freiheit,

2
@EarthMind: se hai intenzione di mettere tutto in una riga, assicurati che sia presente un punto e virgola (;) proprio prima del comando tar. Altrimenti, la base viene passata come variabile d'ambiente a tar, invece di essere una variabile ausiliaria della shell.
Juliano,

@mwojtera la tua tentata modifica dovrebbe essere la sua stessa risposta
pulcini il

10

Cosa ne pensi di questo: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

Spiegazione: si esegue una ricerca su tutti gli elementi nella directory corrente. Maxdepth 0 non lo fa ricorrere più in basso rispetto agli argomenti forniti. (In questo caso *, o tutti gli elementi nella directory corrente) L'argomento 'd' su "-type" corrisponde solo alle directory. Quindi exec esegue tar su qualsiasi corrispondenza. ({} è sostituito dal file corrispondente)


1
Ma poi ricevo ancora l'errore che il percorso indicato è una directory e non un file
EarthMind

3
gzip da solo non archivia le directory
Juliano,

Devi tarare le directory prima di poterle decomprimere.
inkaphink,

1
È necessario tar con l'opzione z, non direttamente gzip per le directory. Molto bello l'utilizzo di find, però.
Freiheit,

3
Errore: "trova: i percorsi devono precedere l'espressione:;" La prima parte funziona, quindi ho usato (solo directory): for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done
JosephK,

4

Questo creerà un file chiamato blah.tar.gz per ogni file in una directory chiamata blah.

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

Se hai più di una semplice directory nella directory (es. Anche i file, poiché ls restituirà tutto nella directory), allora usa questo:

$ cd directory
$ for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done

Grep -v esclude la directory corrente che apparirà nel findcomando di default.


3
Sia ls che find NON sono stati fatti per essere usati in questo modo. Soprattutto, ha lo scopo di presentare i file in un elenco leggibile dall'utente, non di generare elenchi di file come argomenti su "per". Basta usarefor dir in *
Juliano il

1
Ho provato il tuo primo suggerimento, ma non funziona con le directory che contengono spazi nel loro nome
EarthMind,

Inoltre, il primo comando creerà anche un tarball per ciascun file nella directory.
inkaphink,
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.