Le sugiero que use rsync en lugar de cp, si puede, tiene la opción -m que excluirá las carpetas vacías, ejemplo:
rsync -am <origin> <destination>
Explicación del comando en ExplainShell.com
Estoy usando la opción -a porque hace una gran cantidad de buenas acciones predeterminadas, pero si lo desea, también puede usar la opción -r, que establecerá solo el modo recursivo.
[AÑADIR comentario]
No conozco una forma de hacer esto con cp, al menos la página de manual no muestra ninguna opción que lo haga por usted. Probablemente pueda hacer una solución más compleja usando el comando find
para encontrar la lista de archivos/directorios para copiar y luego pasarla a cp, pero eso sería mucho más complicado que rsync. rsync es incluso bastante estándar en muchos linux
cp
de hecho, no tiene una opción para obtener solo archivos, pero como dijo Berserck, puede usar find
junto con cp
. De hecho, esto es realmente sencillo:
# Copy only files
find /path/to/file -type f -execdir cp "{}" /dest/path ";"
O:
# Copy everything except directories
find /path/to/file -not -type d -execdir cp "{}" /dest/path ";"
Explicación
find
es la herramienta que buscará los archivos que deseas. En la primera opción, configuramos -type f
para devolver solo archivos normales. En la segunda opción, configuramos el -not -type d
para obtener todo excepto directorios. find
ejecuta los argumentos pasados a -execdir
reemplazando {}
con una entrada de resultado a la vez y detiene el comando cuando ;
se encuentra (;
se debe escapar \;
o ";"
, o el shell podría expandirlo).
-execdir
ejecutará el comando que tiene la carpeta del archivo como su "directorio de trabajo" y es preferible en lugar de -exec
, verifique a continuación.
El -type
documentación de opciones:
-tipo c
El archivo es de tipo c:
b:bloque (en búfer) especial
c:carácter (sin búfer) especial
d:directorio
p:tubería con nombre (FIFO)
f:archivo normal
l:enlace simbólico; esto nunca es cierto si la opción -L o la opción -follow están activas, a menos que se rompa el enlace simbólico. Si desea buscar enlaces simbólicos cuando -L está en vigor, utilice -xtype.
s:enchufe
D:puerta (Solaris)
El -not
documentación de opciones:
! expr
Verdadero si expr es falso. Por lo general, este carácter también necesitará protección contra la interpretación del caparazón.
-no expr
Igual que ! expr, pero no compatible con POSIX.
El -execdir
documentación de opciones:
-exec comando;
Ejecutar comando; verdadero si se devuelve el estado 0. Todos los siguientes argumentos para encontrar se toman como argumentos para el comando hasta que un argumento consiste en ';' se encuentra La cadena '{}' se reemplaza por el nombre del archivo actual que se procesa en todos los lugares en los que aparece en los argumentos del comando [...]. Es posible que sea necesario escapar de ambas construcciones (con un '\') o citarlas para protegerlas de la expansión del shell. El comando especificado se ejecuta una vez para cada archivo coincidente. El comando se ejecuta en el directorio de inicio. Existen problemas de seguridad inevitables relacionados con el uso de la acción -exec; debería usar la opción -execdir en su lugar.
-execdir comando;
Como -exec, pero el comando especificado se ejecuta desde el subdirectorio que contiene el archivo coincidente , que normalmente no es el directorio en el que comenzó a buscar. Este es un método mucho más seguro para invocar comandos, ya que evita condiciones de carrera durante la resolución de las rutas a los archivos coincidentes. [...] Si usa esta opción, debe asegurarse de que su variable de entorno $PATH no haga referencia a '.'; de lo contrario, un atacante puede ejecutar cualquier comando que desee dejando un archivo con el nombre apropiado en un directorio en el que ejecutará -execdir. Lo mismo se aplica a tener entradas en $PATH que estén vacías o que no sean nombres de directorio absolutos.
https://linux.die.net/man/1/find