2010-07-27 22 views
12

Mi bash fu no es lo que debería ser.gzip up de un conjunto de directorios y creación de un archivo comprimido de alquitrán

Quiero crear un pequeño script por lotes que copiará una lista de directorios en un nuevo archivo zip.

Hay (al menos) dos maneras que se me ocurre que demuestra la lista de archivos:

  1. leídos desde un archivo (digamos config.txt). El archivo contendrá la lista de directorios de la cremallera de O

  2. codificar la lista directamente en la escritura del golpe

La primera opción parece más sencillo (aunque menos elegante).

Los dos problemas que estoy enfrentando es que no estoy seguro de cómo hacer lo siguiente:

  • proporcionar la lista de directorios para el script de shell
  • iterar sobre la lista de directorios

¿Podría alguien sugerir en algunas líneas, cómo puedo hacer esto?

Por cierto, estoy corriendo en Ubuntu 10.0.4

Respuesta

24

Se puede crear un tar comprimido con gzip en la línea de comandos de la siguiente manera:

tar czvf mytar.tar.gz dir1 dir2 .. dirN 

Si quisiera hacer eso en una escritura del golpe y pasar el directorios como argumentos para el script, esos argumentos terminarían en [email protected]. De manera que usted tiene:

tar czvf mytar.tar.gz "[email protected]" 

Si eso es en un script (digamos myscript.sh), que llamarían que a medida:

./myscript.sh dir1 dir2 .. dirN 

Si quiere leer de una lista (opción 1) que podría hacer que como tal (esto no funciona si hay espacios en blanco en los nombres de directorio):

tar czvf mytar.tar.gz $(<config.txt) 
+0

@peter: gracias por su respuesta - lo que casi me lleva a donde quiero estar. Pero soy perezoso, y no quiero escribir la misma lista de archivos cada vez en la línea de comandos (también es propenso a errores) - por eso quiero 'codificar' la lista de directorios, ya sea en el script mismo o por separado mantenido en un archivo externo. ¿Podría explicar cómo puedo modificar los comandos anteriores para hacer eso? – morpheous

+0

dulce !. Eso se parece a lo que quiero hacer. Debo decir que la sintaxis parece bastante temible. Mejor me hago un libro de programación bash - ¡RÁPIDO! :) – morpheous

+0

@morpheus: aparte de comprar un libro, recomendaría leer 'man bash' (en este caso, la sección debajo de * Command Substitution *). También tenga en cuenta que la solución con config.txt no funciona para directorios con espacios en blanco en el nombre. –

0

crear dos archivos: filelist - Coloque todos los directorios necesarios (uno en una sola línea)

y crear un sencillo script bash:

#!/bin/bash 


for DIR in `cat filelist` 
do 
    if [ -d $DIR ] 
    then 
     echo $DIR 
    fi 
done 
0

Puede exportar una variable como directorios = "DIR1 DIR2 dir3 ...." Y en la secuencia de comandos que necesita para utilizar la variable como tar czvf $ DIRECTORIES

0

Simplemente use el byte nulo como delimitador cuando escriba nombres de archivo/directorio en el archivo. ¡De esta manera no necesita preocuparse por espacios, líneas nuevas, etc. en nombres de archivos!

printf "%s\000" */ > listOfDirs.txt # alternative: find ... -print0 

while IFS="" read -r -d '' dir; do command ls -1abd "$dir"; done < listOfDirs.txt 

tar --null -czvf mytar.tar.gz --files-from listOfDirs.txt 
0

En el caso, está buscando comprimir un directorio, el siguiente comando puede ayudar.

pbzip2 compresses directories using parallel implementation

tar cf <outputfile_name> --use-compress-prog=pbzip2 <directory_name> 
Cuestiones relacionadas