cp sólo archivos, omitiendo directorios

cp sólo archivos, omitiendo directorios

El uso de cp para copiar archivos de un directorio que tiene un directorio vacío también genera un valor de retorno de error, lo que falla en mi secuencia de comandos.

¿Hay alguna manera de omitir los directorios sin tener un valor de retorno de error? Me gustaría que el valor de error refleje cualquier error, pero tener un directorio vacío allí debería simplemente omitirse, sin que se informe como un error.

Podría simplemente agregar una bandera recursiva-r , pero ¿qué pasa si simplemente no quiero que se copie el directorio, perohacer¿Quieres que se informe de algún error?

Respuesta1

Te sugiero que uses rsync en lugar de cp, si puedes tiene la opción -m que excluirá las carpetas vacías, ejemplo:

rsync -am <origin> <destination>

Explicación del comando enexplicashell.com

Estoy usando la opción -a porque realiza muchas acciones predeterminadas agradables, pero si quieres también puedes usar la opción -r, que configurará solo el modo recursivo.

[Agregar comentario]

No conozco una manera de hacer esto con cp, al menos la página de manual no muestra ninguna opción que lo haga por usted. Probablemente pueda encontrar una solución más compleja usando el comando findpara buscar una 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

Respuesta2

cpDe hecho, no tiene una opción para obtener solo archivos, pero comoenloquecidodicho, puedes usarlo findjunto 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

findes la herramienta que buscará los archivos que desees. En la primera opción, configuramos -type fpara devolver solo archivos normales. En la segunda opción, configuramos -not -type dpara obtener todo excepto los directorios. findejecuta los argumentos pasados ​​para -execdirreemplazar {}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).

-execdirejecutará el comando teniendo la carpeta del archivo como su "directorio de trabajo" y es preferible en lugar de -exec, verifique a continuación.

La -typedocumentación de la opción:

-tipo c

El archivo es de tipo c:

b: bloque (amortiguado) especial

c: carácter especial (sin búfer)

d: directorio

p: tubería con nombre (FIFO)

f: archivo normal

l: vínculo simbólico; Esto nunca es cierto si la opción -L o la opción -follow están vigentes, a menos que el enlace simbólico esté roto. Si desea buscar enlaces simbólicos cuando -L esté vigente, utilice -xtype.

s: enchufe

D: puerta (Solaris)

La -notdocumentación de la opción:

!exprés

Verdadero si expr es falso. Este carácter también suele necesitar protección contra la interpretación del caparazón.

-noexprés

Igual que ! expr, pero no compatible con POSIX.

La -execdirdocumentación de la opción:

-ejecutivodominio ;

Ejecutardominio;Es verdadero si se devuelve el estado 0. Todos los siguientes argumentos a buscar se consideran argumentos del comando hasta que aparece un argumento que consta de ';' se encuentra. La cadena '{}' se reemplaza por el nombre del archivo actual que se procesa en todos los lugares donde 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 caparazón. 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 en torno al uso de la acción -exec; deberías usar la opción -execdir en su lugar.

-execdirdominio ;

Como -exec, pero lo especificadoEl comando se ejecuta desde el subdirectorio que contiene el archivo coincidente., que normalmente no es el directorio en el que empezó 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 utiliza 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

información relacionada