2016-03-22 11 views
1

Ich habe ein Verzeichnis voller Projekte in, sagen wir /Users/Me/Projects.Erstellen Sie mehrere tar.gz-Archive aus mehreren Verzeichnissen

Innerhalb dieses Ordners befinden sich mehrere Unterverzeichnisse und sogar noch weitere Unterverzeichnisse in einigen.

Ich möchte in der Lage sein, ein tar.gz Archiv jedes Archiv innerhalb /Users/Me/Projects zu erstellen, deren Archive den gleichen Namen wie das Verzeichnis hätten.

Zum Beispiel in der Projects Ordner hätte ich, Project1, Project2, und Project3.

Was ich möchte, ist ein Skript Schleife über die Verzeichnisse in Projects und nicht die Unterverzeichnisse unter dem laufen Project1.tar.gz, Project2.tar.gz und Project3.tar.gz zu erstellen.

Antwort

2

Ohne find:

for dir in */; do tar -czvf "${dir%/}".tar.gz "$dir"; done 

wo */ stellt sicher, dass die glob Verzeichnisse nur Spiele, und "${dir%/}" entfernt von Verzeichnisnamen den Schrägstrich.

Wenn versteckte Verzeichnisse vorhanden sind, werden sie nicht von /*; Holen Sie sich auch diese, wir können shopt -s dotglob verwenden.

+0

Danke für Ihre Antwort. Eine kurze Frage, die ich hatte, wie kann ich dieses Skript ändern, um die neu erstellten Archive irgendwo außerhalb der ursprünglichen Verzeichnisse auszugeben? Die meisten der erweiterten Verzeichnisse, aus denen ich diese Archive erstelle, befinden sich auf meiner externen Festplatte und ich möchte die Archive auf meiner internen Festplatte ablegen. Wäre es wie 'für dir in * /; do tar -czvf /Users/Username/Archives/"${dir%/}".tar.gz "$ dir"; gemacht zum Beispiel? –

+0

@ jzg.dev Genau! Wenn Sie nicht sicher sind, was ein Befehl bewirkt, können Sie immer einfach ein 'echo' davor einfügen und nur die Befehle sehen, die ausgeführt werden, wenn Sie es entfernen, ohne sie auszuführen:' für dir in * /; tun Echo Teer ...' –

+1

Danke für die Hilfe! :) –

1

Nach einigem Suchen und ein bisschen Trial/Error, kam ich mit diesem Skript, um programmatisch zu erreichen, was ich versuchte zu tun.

#! /bin/sh 

    for dir in `find . -maxdepth 1 -mindepth 1 -type d | sed 's|./||'` 
    do 
     tar -czvf /Path/To/Place/Created/Archives/$dir.tar.gz /Path/To/Directories/$dir; 
    done 

gehen wieder aus dem Beispiel, das ich in der Frage gegeben hat, sieht das Skript würde so annehmend ich die Archive in meinem Documents Ordner erstellen wollte.

#! /bin/sh 

    for dir in `find . -maxdepth 1 -mindepth 1 -type d | sed 's|./||'` 
    do 
     tar -czvf /Users/Me/Documents/$dir.tar.gz /Users/Me/Projects/$dir; 
    done 

EDIT

Nach einiger weiteren Forschung, scheint es, dass die von Benjamin W. gegebene Antwort der direkteste Weg, dies zu tun. Ich hatte gehofft, einen Weg zu finden, der Räume aus den neu erstellten Archivnamen streichen würde, um mögliche Probleme auf anderen Dateisystemen zu vermeiden, und während die Methode, die ich beschrieben habe, weißen Raum räumt, hatte sie einige Fehler. finden

+1

Gut für Sie, um Ihre eigene Antwort zu finden, aber [Zeilen mit 'for' nicht lesen (http://mywiki.wooledge.org/DontReadLinesWithFor) –

+0

Sie müssen' sed' am Ende nicht verwenden . at, wenn Sie '-print0 | xargs -0 tar ... 'es wird eine sehr nette Antwort sein – HuStmpHrrr

1

Mit GNU:

cd /Users/Me/Projects 
find . -maxdepth 1 -mindepth 1 -type d -exec tar -cvzf {}.tgz {} \; 
Verwandte Themen