2009-07-10 2 views
31

Ich habe auf ein kleines Unix-Kommandozeilenproblem festgefahren.Wie kann ich eine ganze Ordnerstruktur in Unix zippen, aber nur bestimmte Dateien?

Ich habe einen Website-Ordner (4GB) Ich muss eine Kopie von, aber nur die .php, .html, .js und .css-Dateien (die nur ein paar hundert kb ist) greifen.

Ich denke idealerweise gibt es eine Möglichkeit, einen ganzen Ordner zu komprimieren oder zu tarieren, aber nur bestimmte Dateierweiterungen zu greifen, während die Unterordnerstrukturen erhalten bleiben. Ist das möglich und wenn ja, wie?

Ich habe versucht, eine ganze Zip, dann gehen und bestimmte Dateien ausgeschlossen, aber es schien ein bisschen übertrieben.

Ich bin ein bisschen neu zu Unix.

Alle Ideen würden sehr geschätzt werden.

+4

Sie könnten bessere Ergebnisse, wenn Sie diese auf serverfault.com fragen (eine Sysadmin spezifische Stelle) –

Antwort

38

Schalter in die Website-Ordner, dann

laufen
zip -R foo '*.php' '*.html' '*.js' '*.css' 

Sie können auch diese laufen von außerhalb des Website-Ordner:

zip -r foo website_folder -i '*.php' '*.html' '*.js' '*.css' 
+0

Dies findet keine übereinstimmenden Dateien in Unterverzeichnissen. –

+2

per der Zip-Manpage, müssen Sie die Argumente mit einfachen Anführungszeichen zitieren ... sonst vermute ich, dass die Shell sie vor dem Übergeben zu zip globe – kdgregory

+0

Eigentlich wird es. -R Flag –

1

Sie könnten ein Shell-Skript schreiben, um Dateien basierend auf einem Muster/Ausdruck in einen neuen Ordner zu kopieren, den Inhalt zippen und dann den Ordner löschen. Nun, was die eigentliche Syntax betrifft, überlasse ich es dir: D.

+1

Copy 4 GB Daten? Ich denke, dies sollte als letzter Bericht verwendet werden. – MitMaro

+0

Sie würden nicht das gesamte Verzeichnis kopieren - nur die Dateien, die mit dem Muster übereinstimmen. Auf diese Weise können Sie beim Erstellen der Zip-Datei einfach zip all sagen und dann löschen. – barfoon

+1

@MitMaro das OP sagt, es sind nur ein paar Hundert von KiB ... Wie auch immer, eine verbesserte Version könnte nur Links Links statt Kopieren (wenn symbolische Links, dann -h mit Teer) ...und auf diese Weise können Sie diese Ansicht des Ordners für weitere Backups wiederverwenden :-) – fortran

14

Sie find verwenden können und grep die Dateiliste zu erzeugen, dann Rohr, das in zip

z.B.

find . | egrep "\.(html|css|js|php)$" | zip [email protected] test.zip 

([email protected] sagt zip eine Dateiliste von stdin zu lesen) finden

+4

Wenn Sie eine große Anzahl nicht übereinstimmender Dateien haben, wäre es etwas effizienter, etwas wie "Finden" zu machen. -iname \ *. html -o -iname \ *. css -o -iname \ * .js -o -iname \ * .php' statt 'finden. | Grep ... '. –

3

Sie können verwenden möchten (GNU) alle Ihre PHP zu finden, html etc files.then tar ihnen

find /path -type f \(-iname "*.php" -o -iname "*.css" -o -iname "*.js" -o -iname "*.ext" \) -exec tar -r --file=test.tar "{}" +; 

danach können Sie es zip

+2

das Problem mit diesem Ansatz ist, dass es für jede Datei exec tar – kdgregory

+1

ja tut es. Ein besserer Ansatz ist es, zip -R zu verwenden, wie einer von euch gepostet hat. – ghostdog74

7

Dies ist, wie ich es geschafft, aber ich ghostdog74 Version auch wie.

Sie können zusätzliche Erweiterungen hinzufügen, indem Sie sie zur Regex hinzufügen.

+1

können Probleme mit der Größe der Argumentliste auftreten - siehe xargs – kdgregory

4

Ich mochte Nick's Antwort, aber, da dies eine Programmierseite ist, warum nicht Ant verwenden, um dies zu tun. :)

Dann können Sie einen Parameter eingeben, so dass verschiedene Arten von Dateien gezippt werden können.

http://ant.apache.org/manual/Tasks/zip.html

+1

Ich fand am nützlich, und die Dokumentation ist ziemlich einfach zu folgen. –

Verwandte Themen