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.