TL; DR
find /my/dir/ -printf "%P\n" | tar -czf mydir.tgz --no-recursion -C /my/dir/ -T -
Con algunas condiciones (archivar solo 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
Lamentablemente, a continuación se incluye un directorio principal ./
en el archivo:
tar -czf mydir.tgz -C /my/dir .
Puede mover todos los archivos fuera de ese directorio utilizando la --transform
opción de configuración, pero eso no elimina el .
directorio en sí. Se vuelve cada vez más difícil domar el comando.
Puede usar $(find ...)
para agregar una lista de archivos al comando (como en la respuesta de magnus ), pero eso puede causar un error de "lista de archivos demasiado larga". La mejor manera es combinarlo con la -T
opción tar , de esta manera:
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 enumerar todos los archivos ( -type f
), enlaces ( -type l
) y subdirectorios ( -type d
) en su directorio, hacer que todos los nombres de archivo sean relativos -printf "%P\n"
y luego pasar eso al comando tar (toma los nombres de archivo de STDIN usando -T -
). La -C
opción es necesaria para que tar sepa dónde se encuentran los archivos con nombres relativos. El --no-recursion
indicador es para que el alquitrán no vuelva a aparecer en las carpetas y se le ordena archivar (lo que provoca archivos duplicados).
Si necesita hacer algo especial con los nombres de archivo (filtrado, seguimiento de enlaces simbólicos, etc.), el find
comando es bastante poderoso, y puede probarlo simplemente eliminando 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 archivos PDF, agregue ! -name '*.pdf'
$ find /my/dir/ -printf "%P\n" -type f ! -name '*.pdf' -o -type l -o -type d
> textfile.txt
> subfolder2
> subfolder
> subfolder/.gitignore
Búsqueda no GNU
El comando usa printf
(disponible en GNU find
) que le indica find
que imprima sus resultados con rutas relativas. Sin embargo, si no tiene GNU find
, esto funciona para que las rutas sean relativas (elimina a 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 -
tar -czf
? En mi caso, solo está almacenando los archivos y no el directorio. Cuando acabo detar
incluir el directorio, lo incluye perotar -czf
solo agrega los archivos.