¿Cómo probar qué archivos se copiarán con el comando cp?

11

Estoy creando un script simple que copia todos los archivos del DIRECTORIO A que no existen en el DIRECTORIO B. Estoy haciendo esto mediante el uso del comando cp:

cp -u DIRECTORYA/* DIRECTORYB

Lo que me gustaría hacer también es enviar un correo electrónico a un administrador que enumere los archivos que se han copiado.

Entonces, idealmente, antes de ejecutar el comando anterior, me gustaría obtener los archivos que se copiarán y almacenarlos en una variable para su uso posterior al crear mi mensaje de correo electrónico.

¿Alguien puede señalarme en la dirección correcta? He investigado el uso de grep pero no creo que esto se pueda hacer con el comando cp.

James
fuente
1
Tal vez estoy malinterpretando su pregunta, pero ¿no puede usar la -vbandera para imprimir los nombres de los archivos mientras se copian? Redireccione eso a un archivo o directamente en una variable y úselo para construir su mensaje.
ThibautRenaux
Además, el cpcomando tiene una opción --attributes-onlyque no permite copiar datos de archivos, sino solo directorios y estructura de archivos.
Costas
Lo siento, soy bastante nuevo en las secuencias de comandos. Si uso el indicador -v, ¿cómo puedo generar una salida en una variable en lugar de un archivo?
James
1
Suponiendo que está utilizando bash, variable=$(cp -v ...)captura el stdout de cp. Ver gnu.org/software/bash/manual/html_node/Command-Substitution.htm
Gowtham

Respuestas:

4

No creo que GNU cptenga algo para ayudarte si quieres ver qué haría sin actuar. Si desea registrar los archivos que se modificaron, puede usar la -vopción:

cp -puv DIRECTORYA/* DIRECTORYB >copy.log

En lugar de esto cp, puede usar rsync , que es mucho más potente e instalado en casi todas partes, excepto en los sistemas integrados de gama baja (y fácil de instalar donde no está presente de forma predeterminada).

rsync -aun DIRECTORYA/* DIRECTORYB >what-would-be-done.txt

o

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log
Gilles 'SO- deja de ser malvado'
fuente
2

Si quisieras correr cp foo*bar whatever, entonces corre en su echo foo*bar whateverlugar.

VaTo
fuente
Pero OP quiere correr cp -uy está buscando una opción de carrera en seco para cp.
Arkadiusz Drabczyk
2

De acuerdo con la página del manual ,

-u, copie solo cuando el archivo SOURCE sea más nuevo que el archivo de destino o cuando falte el archivo de destino--update

Esta es una característica que combina dos pruebas, una trivial para implementar en un script ( falta ) y otra que requiere algo de trabajo ( más reciente ). Puede crear un script que informe lo que se necesita usando comm, diffy test.

Ninguna de las cputilidades estándar proporciona la capacidad de ejecutar en seco una operación de copia. Como se sugiere, rsynces la forma de hacerlo con una utilidad comúnmente disponible. Por supuesto, rsyncgeneralmente se usa para copiar en función de más criterios que simplemente nuevos o faltantes (también se usan el tamaño del archivo y las marcas de tiempo). Pero se puede reducir a hacer lo justo cp -u.

Para las utilidades no estándar, existe la copyutilidad que escribí (y, por supuesto, todavía uso) a fines de la década de 1980. Probablemente se inspiró en la makeutilidad, ya que la primera opción que agregué fue -n.

Para el ejemplo dado, se usaría así:

$ copy -nvU DIRECTORYA/* DIRECTORYB
** copy DIRECTORYA/foo to DIRECTORYB/foo
** 1 file would be copied, 616 bytes

Otras lecturas:

  • copy - utilidad de copia de archivo / directorio

    -n desactiva la creación o modificación real de archivos y (según el nivel de detalle) muestra el efecto que copy tendría el comando.
    -u copia archivos solo si su tamaño o fecha de modificación difiere, y vincula solo si el texto del enlace difiere.
    -U solo copia archivos que son más nuevos que el destino o que no existen en el destino.

  • Entrada de registro de cambios de agosto de 1988 :

    1988-08-16    
            * src / copy / src / copy.c: se agregaron las opciones "-d" y "-n".
    
Thomas Dickey
fuente
0

Puedes usar el comando diff. Tengo un trabajo que copia algunos archivos de respaldo todos los días. alguna vez necesito verificar si todos los archivos están copiados, aquí está la sintaxis:

diff /file1/ /file2/

y por supuesto si quieres copiarlos usa:

cp -u /file1/* /file2
pobre
fuente
0

Considere usar rsync en su lugar. Rsync funciona perfectamente bien en copias locales y ciertamente puede hacer lo que quiera, una vez que pase por las quince millones de opciones que tiene.

rsync -avun DIRECTORYA/ DIRECTORYB

le mostrará todo lo que se haría, y

rsync -avu DIRECTORYA/ DIRECTORYB

lo haré.

Edward Falk
fuente