¿Cómo puedo tar un directorio de archivos y carpetas, sin incluir en el mismo directorio?

Que suelen hacer:

tar -czvf my_directory.tar.gz my_directory

¿Qué pasa si sólo desea incluir todo (incluyendo archivos ocultos del sistema) en mi_directorio, pero no en el mismo directorio? No quiero:

my_directory
   --- my_file
   --- my_file
   --- my_file

Quiero:

my_file
my_file
my_file
  • Realmente no se de programación, pero quizás más apropiado a serverfault.com.
  • Hoy en día sería apropiado para superuser.com
  • Es que el comportamiento predeterminado de hacer tar -czf? En mi caso es sólo almacenar los archivos y no el directorio. Cuando acabo de tar el directorio incluye pero con tar -czf es sólo la adición de los archivos.
InformationsquelleAutor | 2009-06-02

15 Kommentare

  1. 217
    cd my_directory/&& tar -zcvf ../my_dir.tgz . && cd - 
    

    debe hacer el trabajo en una línea. Funciona bien para archivos ocultos así. «*» no se expanda archivos ocultos por el nombre de la ruta de expansión, al menos en bash. A continuación es mi experimento:

    $ mkdir my_directory
    $ touch my_directory/file1
    $ touch my_directory/file2
    $ touch my_directory/.hiddenfile1
    $ touch my_directory/.hiddenfile2
    $ cd my_directory/&& tar -zcvf ../my_dir.tgz . && cd ..
    ./
    ./file1
    ./file2
    ./.hiddenfile1
    ./.hiddenfile2
    $ tar ztf my_dir.tgz
    ./
    ./file1
    ./file2
    ./.hiddenfile1
    ./.hiddenfile2
    
    • Esto también va a trabajar en archivos con espacios u otros caracteres especiales. Buen trabajo!
    • No es perfecto – tar archivo contiene ‘.’ y también ./archivo1 en lugar de sólo archivo1. Me gusta la solución por mateusza a continuación para usar –strip-componentes cuando la onu-tarring.
    • si reemplaza . con * por lo que el comando será cd my_directory/ && tar -zcvf ../my_dir.tgz * && cd .. entonces todo funcionará como se espera.
    • También puede utilizar una subshell para su actual consola del directorio de trabajo no cambia: $ (cd my_directory/ && tar -zcvf ../my_dir.tgz .)
    • Sé que es una respuesta anterior, pero cding en directorios y fuera es bastante cojo. Al menos podría utilizar pushd y popd si tar no tenía banderas como -C.
  2. 630

    Utilizar el -C interruptor de alquitrán:

    tar -czvf my_directory.tar.gz -C my_directory .
    

    La -C my_directory le dice a tar para cambiar el directorio actual a my_directory y, a continuación, . significa «añadir todo el directorio actual» (incluyendo todos los archivos y sub-directorios).

    Asegúrese de que usted haga -C my_directory antes de hacer . o de lo contrario vas a tener los archivos en el directorio actual.

    • +1 gracias! Era el maldito ‘.’ Me estaba perdiendo. así agravantes
    • «A diferencia de la mayoría de las opciones, -C se procesa en el punto en el que se produce dentro de la lista de archivos a procesar. Considere el siguiente comando: tar --create --file=foo.tar -C /etc passwd hosts -C /lib libc.a» apl.jhu.edu/Misc/Unix-info/tar/tar_65.html siempre trato tar -czvf my_directory.tar.gz * -C my_directory y que no funciona. -C la ubicación es importante! Maldito tar…
    • No es perfecto – tar archivo contiene ‘.’ y también ./archivo1 en lugar de sólo archivo1. Me gusta la solución por mateusza a continuación para usar –strip-componentes cuando la onu-tarring.
    • extrañamente -C falla si se combina con el englobamiento de comodines. Es globs en el los directorio actual y, a continuación, intenta encontrar los archivos en la tar directorio actual. tar cf foo.tar -C /lib lib* resultados en tar: lib*: Cannot stat: No such file or directory
    • el shell expande a los comodines antes de ejecutar el alquitrán. También tenga en cuenta que el uso de un comodín como * no incluir archivos ocultos (que era el requisito original).
    • Yo no sabía acerca de el «.» para agregar el todo directorio. A gusto de los dos-en-uno de la receta por dubek!
    • Esto es especialmente útil cuando usted está utilizando tar como un reemplazo para cp.
    • Crea . como un directorio raíz en .tar.gz.
    • Para aquellos que no quieren el . directorio padre, aquí está la solución

  3. 55

    También puede crear archivos como de costumbre y extraer con:

    tar --strip-components 1 -xvf my_directory.tar.gz
    
    • Esta solución es especialmente útil en situaciones donde se trabaja con archivos comprimidos creados antes de que todas sus necesidades se sabe…
    • Cuenta que --strip-components es una extensión de GNU.
    • Esta respuesta puede ser mejorado por el «como de costumbre» ejemplo en contexto.
  4. 32

    Echar un vistazo a --transform/--xform, te da la oportunidad para masajear el nombre de archivo que el archivo se añade al archivo:

    % mkdir my_directory
    % touch my_directory/file1
    % touch my_directory/file2
    % touch my_directory/.hiddenfile1
    % touch my_directory/.hiddenfile2
    % tar -v -c -f my_dir.tgz --xform='s,my_directory/,,' $(find my_directory -type f)
    my_directory/file2
    my_directory/.hiddenfile1
    my_directory/.hiddenfile2
    my_directory/file1
    % tar -t -f my_dir.tgz 
    file2
    .hiddenfile1
    .hiddenfile2
    file1
    

    Transformar la expresión es similar a la de sed, y podemos utilizar separadores de otros que / (, en el ejemplo de arriba).

    https://www.gnu.org/software/tar/manual/html_section/tar_52.html

    • Yo iba a hacer esto. Nada, es sólo un hack!
    • Esta es una solución mucho mejor.
    • Esta es la mejor solución.
    • Buena solución, pero puede causar file list too long. Mi solución impide que y es más flexible.
  5. 22

    TL;DR

    find /my/dir/-printf "%P\n" | tar -czf mydir.tgz --no-recursion -C /my/dir/-T -
    

    Con algunas condiciones (archivar los archivos, directorios y enlaces simbólicos):

    find /my/dir/-printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/-T -
    

    Explicación

    La siguiente desafortunadamente incluye un directorio padre ./ en el archivo:

    tar -czf mydir.tgz -C /my/dir .
    

    Puede mover todos los archivos de ese directorio mediante el --transform opción de configuración, pero eso no deshacerse de la . propio directorio. Se hace cada vez más difícil de domesticar el comando.

    Usted podría utilizar $(find ...) para agregar una lista de archivos con el comando (como en magnus’ respuesta), pero que potencialmente causa de un «archivo de la lista es demasiado larga» de error. La mejor manera es combinarlo con tar -T opción, como este:

    find /my/dir/-printf "%P\n" -type f -o -type l -o -type d | tar -czf mydir.tgz --no-recursion -C /my/dir/-T -
    

    Básicamente lo que hace es la lista de todos los archivos (-type f), enlaces (-type l) y subdirectorios (-type d) en virtud de su directorio, hacer todos los nombres de archivo relativa mediante -printf "%P\n", y, a continuación, pasar al comando tar (toma los nombres de archivo de STDIN utilizando -T -). El -C opción es necesaria para que el alquitrán sabe donde los archivos con nombres relativos se encuentran. El --no-recursion bandera es así que tar no recurse en carpetas, se le dice que se archive (causando archivos duplicados).

    Si usted necesita para hacer algo especial con los nombres de archivo (filtrado, los siguientes enlaces, etc), el find comando es bastante potente, y puede probar sólo la eliminación de la tar parte del comando anterior:

    $ find /my/dir/-printf "%P\n" -type f -o -type l -o -type d
    > textfile.txt
    > documentation.pdf
    > subfolder2
    > subfolder
    > subfolder/.gitignore
    

    Por ejemplo, si desea filtrar los archivos PDF, añadir ! -name '*.pdf'

    $ find /my/dir/-printf "%P\n" -type f ! -name '*.pdf' -o -type l -o -type d
    > textfile.txt
    > subfolder2
    > subfolder
    > subfolder/.gitignore
    

    No-GNU encontrar

    El comando utiliza printf (disponible en GNU find) que dice find para imprimir sus resultados con rutas relativas. Sin embargo, si usted no tiene GNU find, esto funciona para hacer las rutas de acceso relativas (elimina los padres con sed):

    find /my/dir/-type f -o -type l -o -type d | sed s,^/my/dir/,, | tar -czf mydir.tgz --no-recursion -C /my/dir/-T -
    
    • Gran respuesta. Muy elaborado, y lo que es más importante, se solucionó el problema a la perfección.
  6. 16

    Esta Respuesta debería funcionar en la mayoría de las situaciones. Nota cómo los nombres de los archivos son almacenados en el fichero tar, por ejemplo, ./file1 en lugar de sólo file1. He encontrado que esto causó problemas cuando se utiliza este método para manipular ficheros utilizados como archivos de paquete en BuildRoot.

    Una solución es utilizar algunos Bash globs a la lista de todos los archivos excepto para .. como este:

    tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *
    

    Este es un truco que aprendí de la esta respuesta.

    Ahora alquitrán, se devolverá un error si no hay archivos que coincidan con ..?* o .[^.]* , pero va a funcionar. Si el error es un problema (que son la comprobación de éxitos en una secuencia de comandos), esto funciona:

    shopt -s nullglob
    tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *
    shopt -u nullglob
    

    Aunque ahora estamos jugando con shell opciones, podríamos decidir que es más claro tiene * partido archivos ocultos:

    shopt -s dotglob
    tar -C my_dir -zcvf my_dir.tar.gz *
    shopt -u dotglob
    

    Esto puede que no funcione cuando tu shell de bolas * en el directorio actual, por lo que como alternativa, utilice:

    shopt -s dotglob
    cd my_dir
    tar -zcvf ../my_dir.tar.gz *
    cd ..
    shopt -u dotglob
    
    • Puedo obtener extraño errores cuando hago esto tar: start.sh: Cannot stat: No such file or directory Esto sucede a todos los archivos en mi directorio actual! ¿Cómo puedo evitar esto?
    • Puedo obtener exactamente los mismos resultados.
    • Quitar el – de las opciones de comando.
  7. 14
    cd my_directory
    tar zcvf ../my_directory.tar.gz *
    
    • Hal le pide explícitamente acerca de los archivos ocultos. Usted también necesita .??*.
    • -1: Esto no agregar los archivos ocultos a la tar. Ver tbman la respuesta.
  8. 3

    Si se trata de un sistema Unix/Linux, y usted se preocupa acerca de los archivos ocultos (que será extrañado por *), usted necesita hacer:

    cd my_directory
    tar zcvf ../my_directory.tar.gz * .??*
    

    No sé qué archivos ocultos bajo Windows.

    • esto funcionó bien en mi caso. gracias
    • Esto debe ser aceptado respuesta 🙂
  9. 2

    Yo propondría la siguiente función Bash (primer argumento es la ruta de acceso al directorio, el segundo argumento es el nombre base del archivo resultante):

    function tar_dir_contents ()
    {
        local DIRPATH="$1"
        local TARARCH="$2.tar.gz"
        local ORGIFS="$IFS"
        IFS=$'\n'
        tar -C "$DIRPATH" -czf "$TARARCH" $( ls -a "$DIRPATH" | grep -v '\(^\.$\)\|\(^\.\.$\)' )
        IFS="$ORGIFS"
    }
    

    Se puede ejecutar en esta manera:

    $ tar_dir_contents /path/to/some/dir my_archive
    

    y se generará el archivo my_archive.tar.gz dentro del directorio actual. Funciona con ocultos (.*) elementos y con los elementos con espacios en su nombre de archivo.

  10. 2
    cd my_directory && tar -czvf ../my_directory.tar.gz $(ls -A) && cd ..
    

    Este uno trabajaba para mí y se incluyen todos los archivos ocultos sin poner todos los archivos en un directorio raíz llamado «.» como en tomoe la respuesta :

  11. 0

    El uso de pax.

    Pax es un paquete obsoleto, pero hace su trabajo perfectamente y de una manera sencilla.

    pax -w > mydir.tar mydir
    
    • Más práctica y la que hace el trabajo +1
    • este comando crea mydir.tar con contenido: mydir/archivo1 mydir/archivo2, exactamente lo que debía ser evitado.
  12. 0

    Forma más sencilla que he encontrado:

    cd mi_dir && tar-czvf ../my_dir.tar.gz *

    • Que no se incluyen los archivos ocultos.
  13. 0
    # tar all files within and deeper in a given directory
    # with no prefixes ( neither <directory>/nor ./)
    # parameters: <source directory> <target archive file>
    function tar_all_in_dir {
        { cd "$1" && find -type f -print0; } \
        | cut --zero-terminated --characters=3- \
        | tar --create --file="$2" --directory="$1" --null --files-from=-
    }
    

    Maneja de forma segura los nombres de archivo con espacios u otros caracteres inusuales. Opcionalmente, se puede añadir un -name '*.sql' o similares de filtro para el comando de búsqueda para limitar los archivos incluidos.

  14. -1
     tar -cvzf  tarlearn.tar.gz --remove-files mytemp/*
    

    Si la carpeta es mytemp luego si aplicar lo anterior se zip y extraiga todos los archivos en la carpeta, pero dejarlo solo

     tar -cvzf  tarlearn.tar.gz --remove-files --exclude='*12_2008*' --no-recursion mytemp/*
    

    Usted puede dar a excluir de los patrones y también especificar que no se buscar en subcarpetas demasiado

  15. -3
    tar -C my_dir -zcvf my_dir.tar.gz `ls my_dir`
    
    • -1 El ls se producirá cuando hay espacios en los nombres de archivo.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea