¿Cómo copiar directorios en Linux en estas situaciones usando cp?

4

Situación 1

Como copio /home/src/somedir a /dest/ de modo que el camino siempre termina como /dest/somedir, independientemente de si /dest/somedir ¿ya existe?

Quiero evitar terminar con /dest/somedir/somedir.

Situacion 2

¿Cómo copio todo dentro? /home/src/somedir a /dest/ tal que /dest/somedir no se crea y se ignora si ya existe?


¿Hay reglas sobre las barras diagonales que puedo usar? Pensé que terminar con una barra inclinada significaba siempre copiar solo el contenido, pero a menudo me sale mal.

Person
fuente
1
¿Qué entiendes específicamente por "ignorado"? ¿Quieres que la copia continúe o aborte? cp -r /home/src/somedir /dest/ debe abordar ambas situaciones, ya sea creando o fusionándose en la carpeta existente
Frank Thomas
Tiene que estar con cp? Probablemente hay una opción correcta para rsync que hare esto
Barmar

Respuestas:

6

cp siempre copiará el (los) archivo (s) al inicio del comando al archivo o directorio al final del comando. La barra diagonal no hace mucho a los argumentos, a menos que el argumento sea un enlace simbólico a un directorio. Luego, al tener la barra diagonal se tratará como un directorio, mientras que al omitir la barra se copiará el enlace.

Suponiendo que desea copiar de forma recursiva cualquier subdirectorio en sus ejemplos, lo haría como:

cp -r /home/src/somedir /dest

y

cp -r /home/src/somedir/* /dest

El primero obtiene el directorio. /home/src/somedir y copiará ese argumento, el directorio mismo y todos sus contenidos, al último argumento, /dest. Creará el somedir directorio en /dest Si es necesario y úsalo si ya existe.

El segundo añade * hasta el final del primer argumento, que el shell expandirá para ser cada archivo que no comience con . en /home/src/somedir y copiará todos esos archivos y directorios a /dest sin tener en cuenta lo que ya está allí (excepto algunas banderas para cp le indicará que sobrescriba los archivos que tendrán lo mismo en el destino que un archivo existente).

Como los comentarios a esta respuesta han señalado, hay problemas al usar * para agarrar todos los archivos en el directorio. Una alternativa sería utilizar tar hacer la copia por ti

tar -c -C /home/src/somedir . | tar -x -C /dest

esto creará un archivo tar de somedir sin el camino principal mediante el uso de -C para cambiar a ese directorio primero. Por defecto tar imprimirá a stdout que luego se canalizará a otro tar Para extraerlo cambiando a la deseada. /dest directorio primero Esto también preservará muchos atributos de archivo, que cp puede hacer lo mismo

Eric Renouf
fuente
2
Vale la pena señalar que * la expansión de comodines fallará si hay demasiadas coincidencias. No sé el número exacto, pero la última vez que falló, el directorio contenía alrededor de 100000 archivos / directorios.
Aleks G
Buen punto, también si no hay archivos por defecto intentará copiar un archivo llamado *
Eric Renouf
De hecho, en un script de nivel de producción se agregarían todas estas comprobaciones.
Aleks G
Sí, definitivamente queremos evitar el comodín ya que no copia los archivos ocultos y tiene problemas en la forma en que se expande en el shell.
Person
@AleksG y @Person dadas las observaciones de dificultades con globs, incluí una alternativa que no usa cp pero debe cumplir la tarea
Eric Renouf
2

¿Cómo copio / home / src / somedir a / dest / para que el camino siempre termine como / dest / somedir, independientemente de si / dest / somedir ya existe?

cp -rv /home/src/somedir /dest

Estamos copiando «somedir» a «/ dest», por lo que terminamos con «/ dest / somedir»

¿Cómo copio todo dentro de / home / src / somedir a / dest / tal que / dest / somedir no se crea y se ignora si ya existe?

cp -rv /home/src/somedir/* /dest

Estamos copiando «todos los archivos en somedir» ( somedir/* ) a «/ dest»

Advertencia: somedir / * no incluye archivos ocultos (aquellos que comienzan con un punto).

Las barras finales no afectan el proceso. Puedes estar confundido cp con rsync, donde una barra al final significa "copiar el contenido, no la carpeta".

Ángel
fuente
Creo que a esta respuesta le falta una explicación sobre el uso de un punto final para lograr copiar los archivos.
Person