Cómo copiar archivos de la carpeta sin la carpeta misma


39

Estoy tratando de copiar archivos y subcarpetas de la carpeta A sin la A en sí. Por ejemplo, una carpeta contiene el siguiente:

| file1.txt   
| file2.txt    
| subfolder1   

Ejecutar el siguiente comando me da un resultado incorrecto:

sudo cp -r /home/username/A/ /usr/lib/B/

El resultado es

/usr/lib/B/A/...copied files...

en lugar de..

/usr/lib/B/...copied files...

¿Cómo puedo llegar al esperado sin la carpeta de origen?

Respuestas:


67

cp avanzado

cp -r /home/username/A/. /usr/lib/B/

Esto es especialmente bueno porque funciona sin importar si el directorio de destino ya existe.

concha

Si no hay demasiados objetos en el directorio, puede utilizar el globbing de shell:

mkdir -p /usr/lib/B/
shopt -s dotglob
cp -r /home/username/A/* /usr/lib/B/

rsync

rsync -a /home/username/A/ /usr/lib/B/

El /final de la ruta de origen es importante; funciona sin importar si el directorio de destino ya existe.

encontrar

mkdir -p /usr/lib/B/
find /home/username/A/ -mindepth 1 -maxdepth 1 -exec cp -r -t /usr/lib/B/ {} +

o si no necesita subdirectorios vacíos:

find /home/username/A/ -mindepth 1 -type f -exec cp --parents -t /usr/lib/B/ {} +

(sin mkdir)


¡El primero funciona bien! ¿Alguna idea de por qué home / username / A / * (con el símbolo de estrella) no tiene sentido? La variante con punto al final me ayudó, ¡gracias!
— pushandpop

@pushandpop A/*tiene sentido, pero hay situaciones en las que no funciona.
— Hauke ​​Laging

3
shoptEs bashespecífico. Con zsh, uso *(D). con ksh93, FIGNORE='@(.|..)'. cp -tes específico de GNU. El finduno no funcionará correctamente, ya que copiará ambos A/y su contenido (incluidas las subdirecciones) varias veces.
— Stéphane Chazelas

1
También quiere -maxdepth 1( -mindepthy -maxdepthser extensiones GNU ahora también es compatible con algunos otros. Portablemente find .../. ! -name . -prune -exec ....)
— Stéphane Chazelas

@ StéphaneChazelas Supongo que hay un error tipográfico en alguna parte. find .../.Causa un error aquí.
— Hauke ​​Laging

10

Si está en un sistema GNU, de man cp:

   -T, --no-target-directory
          treat DEST as a normal file

Esto le permite escribir cp -rT /home/username/A/ /usr/lib/B/para hacer exactamente lo correcto.


Esta debería ser la respuesta aceptada, esto es apropiado que hacer balbuceos o usar algo más que cp. Pero eso es cierto que -Tno funcionará con un no GNU cp.
— noraj

3

Indique cpque copie el contenido del directorio y no el directorio en sí:

sudo cp -r /home/username/A/* /usr/lib/B/

¡Gracias! Pero dice: / usr / lib / B / no es un directorio
— pushandpop

Necesitará que shopt -s dotglobesto funcione si hay algún archivo de puntos /home/username/A/.
— talkloud

1
@pushandpop bueno, sí. Ese es el objetivo que tenía en su pregunta, así que supuse que era un directorio. Debe crear el destino antes de intentar copiar archivos en él.
— terdon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.