Probablemente pueda escribir un script de shell para buscar solo archivos, luego pasar la lista a tar, pero me pregunto si ya hay una característica incorporada en tar que permita hacer eso, en una sola línea de comando.
Por ejemplo, encontré el --no-recursion
interruptor, pero cuando lo hago:
tar --no-recursion -cvf mydir.tar mydir
Solo archiva los nombres de las entradas en el directorio (¡incluidos los subdirectorios!), Pero no archiva ningún archivo.
También probé:
tar --no-recursion -cvf mydir.tar mydir/*
Pero aunque solo archiva archivos, también archiva los nombres de los subdirectorios.
¿Hay alguna manera de decirle a los archivos tar solamente, sin directorios?
find mydir -type f |xargs cp -t tempdir
y luego tar tempdir.find mydir -depth 1 -type f | xargs tar cf mydir.tar
find mydir -maxdepth 1 -type f -exec tar cvf mydir.tar {} +
. El+
pone todos los archivos en la misma línea de comando como xargs.Respuestas:
Como señala Camh, el comando anterior tenía un pequeño problema en el sentido de que dado demasiados nombres de archivo, se ejecutaría más de una vez, con invocaciones posteriores que borraban silenciosamente las ejecuciones anteriores. Como tampoco estamos comprimiendo, podemos agregar en lugar de sobrescribir:
La respuesta de Iocnarz de usar
tar
's--null
y-T
opciones también funciona. Si lo hacpio
instalado, la respuesta de Camh al usarlo también está bien. Y si tienezsh
y no le importa usarlo para un comando, la respuesta de Gilles usando un zsh glob (*(.)
) parece la más sencilla.La clave era la
-maxdepth
opción. Respuesta final, lidiando con espacios adecuadamenteEsto también debería funcionar:
fuente
tar
. Ambosxargs
yfind
con la+
variante tienen un número máximo de argumentos que se pueden pasar a tar. Esto dará como resultado que la segunda invocación de tar sobrescriba la salida de la primera.-x
para forzar a los xargs a fallar en lugar de perder datos, y aunque es mejor que un error de pérdida de datos silencioso, aún no es ideal. Este error de clasificación es muy peligroso porque todo parece estar bien al principio, pero a medida que la lista de archivos crece con el tiempo, comienzas a activarlo y es posible que no lo notes hasta que intentes restaurar tu copia de seguridad. Entonces es muy tarde.Cuando quiera usar
find
contar
, la mejor manera es usar encpio
lugar detar
.cpio
puede escribir archivos tar y está diseñado para tomar la lista de archivos para archivar desde stdin.El uso de
find
ycpio
es un enfoque más unix-y en el que permitefind
hacer la selección de archivos con toda la potencia que tiene, y permitecpio
realizar el archivo. Vale la pena aprender este uso simplecpio
, ya que le resulta fácil resolver los problemas con los que golpea su ventaja cuando lo intentatar
.fuente
-maxdepth
antes-type
.No estoy seguro de entender sus requisitos. Si desea almacenar los archivos regulares
mydir
pero no sus subdirectorios, la forma más fácil es usar zsh, donde solo los archivos regulares coincidentes son la simple cuestión de usar el.
calificador glob :fuente
Incluso puede usar
find ... -print0
ytar ... --null
directamente sin usarxargs
en absoluto.En el ejemplo dado, la
--no-recursion
opción atar
no es necesaria porque solo las rutas de los archivos (y no los directorios) se pasarán defind
atar
.Sin embargo, el uso de la
--no-recursion
opcióntar
en el siguiente ejemplo evita eltar
doble archivo de directorios.find
hará la recursión del árbol de directorios en lugar detar
entonces.fuente
Como
man tar
dice el párrafo introductorio en (última oración),Lo cual entiendo como un "no" a su pregunta.
fuente
--no-recursion
. Ej .--exclude-tag
, Etc.). Estoy investigando lo--exclude-tag
que parece prometedor, pero parece ser exactamente lo contrario de lo que estoy buscando.Omita
-C startdir
y reemplace.
constartdir
si debería aparecer en el archivo.Este es el método más eficiente basado en las características de libfind. Libfind también ofrece primarios
-chown
-chgrp
-chmod
que modifican las estadísticas de estructura en su lugar y permiten archivar diferentes metadatos. Esto también funciona en modo de lista y extracción y evita la necesidad de extraer todo el archivo en muchos casos.fuente
-find
en-copy
modo? La sinopsis de la página de manual sugiere que puede hacerlo, pero no he podido hacerlo funcionar (al intentar responder Cómo copiar archivos modificados mientras se preserva la estructura de carpetas ) (con schily-2016-02-10)star -find
.Podría haber encontrado una solución.
find mydir -type f -printf '%P\0'|tar czvf mydir.tar.gz -C mydir --null -T -
Esto puede ser un poco costoso, pero de todos modos funcionará, porque esto no depende de los xargs.
fuente
dir = your_dir; cd $ dir; tar -cvf file.tar `buscar. -maxdepth 1 -type f -print`
fuente