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?

pushandpop
fuente

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)

Hauke ​​Laging
fuente
¡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.

michas
fuente
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/
terdon
fuente
¡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