2009-07-10 11 views
31

Sono stato bloccato su un piccolo problema di riga di comando Unix.come faccio a chiudere un intero albero di cartelle in unix, ma solo alcuni file?

Ho una cartella del sito web (4gb) Ho bisogno di prendere una copia di, ma solo i file .php, .html, .js e .css (che è solo un paio di centinaia di kb).

Sto pensando idealmente, c'è un modo per comprimere o tarare un'intera cartella ma solo afferrare determinate estensioni di file, pur mantenendo le strutture di sottocartelle. È possibile e se sì, come?

Ho provato a fare un'intera zip, quindi a passare e escludendo alcuni file ma sembrava un po 'eccessivo.

Sono un po 'nuovo da unix.

Qualsiasi idea sarebbe molto apprezzata.

+4

Si potrebbe ottenere risultati migliori se si chiede questo su serverfault.com (un sito specifico sysadmin) –

risposta

38

Passare nella cartella sito, quindi eseguire

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

è anche possibile eseguire questo dal di fuori della cartella sito:

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

Questo non troverà i file corrispondenti nelle sottodirectory. –

+2

per la manpage di zip, devi citare gli argomenti con le virgolette singole ... altrimenti, ho il sospetto che la shell li circondi prima di passare al zip – kdgregory

+0

In realtà, lo farà. -R flag –

1

È possibile scrivere uno script di shell per copiare i file in base a un modello/espressione in una nuova cartella, comprimere il contenuto e quindi eliminare la cartella. Ora, per quanto riguarda la sua sintassi reale, lascialo a te: D.

+1

Copia 4 Gb di dati? Penso che dovrebbe essere usato come ultimo rapporto. – MitMaro

+0

Non copierete l'intera directory, solo i file che corrispondono al modello. In questo modo quando crei lo zip puoi dire tutto zip, quindi eliminare. – barfoon

+1

@MitMaro l'OP dice che sono solo alcuni hundres di KiB ... ad ogni modo, una versione migliorata potrebbe essere fatta solo link link invece di copiare (se link simbolici, quindi usare -h con tar) ...e in questo modo è possibile riutilizzare quella vista della cartella per ulteriori backup :-) – fortran

14

È possibile utilizzare find e grep per generare l'elenco dei file, poi tubo che in zip

esempio

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

([email protected] dice zip per leggere un elenco di file da standard input)

+4

Se si dispone di un numero elevato di file non corrispondenti, sarebbe leggermente più efficiente eseguire qualcosa come 'find. -iname \ *. html -o -iname \ *. css -o -iname \ *. js -o -iname \ *. php' invece di 'find. | grep ... '. –

3

si può decidere di utilizzare trovare (GNU) per trovare tutti i tuoi php, html ecc files.Then tar li

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

dopo che si può comprimere fino

+2

il problema con questo approccio è che eseguirà tar per ogni file – kdgregory

+1

sì, sì. un approccio migliore è usare zip -R come uno di voi ha pubblicato. – ghostdog74

7

Questo è come sono riuscito a farlo, ma mi piace anche la versione per ghostdog74.

tar -czvf archive.tgz `find test/ | egrep ".*\.html|.*\.php"` 

È possibile aggiungere estensioni aggiuntive aggiungendole alla regex.

+1

potresti incorrere in problemi con la dimensione dell'elenco degli argomenti - vedi xargs – kdgregory

4

Mi è piaciuta la risposta di Nick, ma poiché questo è un sito di programmazione, perché non usare Ant per farlo. :)

Quindi è possibile inserire un parametro in modo che i diversi tipi di file possano essere compressi.

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

+1

Ho trovato utile la formica, e la documentazione è piuttosto facile da seguire. –

Problemi correlati