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.
-v
bandera 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.cp
comando tiene una opción--attributes-only
que no permite copiar datos de archivos, sino solo directorios y estructura de archivos.variable=$(cp -v ...)
captura el stdout de cp. Ver gnu.org/software/bash/manual/html_node/Command-Substitution.htmRespuestas:
No creo que GNU
cp
tenga algo para ayudarte si quieres ver qué haría sin actuar. Si desea registrar los archivos que se modificaron, puede usar la-v
opción: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).o
fuente
Si quisieras correr
cp foo*bar whatever
, entonces corre en suecho foo*bar whatever
lugar.fuente
cp -u
y está buscando una opción de carrera en seco para cp.De acuerdo con la página del manual ,
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
,diff
ytest
.Ninguna de las
cp
utilidades estándar proporciona la capacidad de ejecutar en seco una operación de copia. Como se sugiere,rsync
es la forma de hacerlo con una utilidad comúnmente disponible. Por supuesto,rsync
generalmente 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 justocp -u
.Para las utilidades no estándar, existe la
copy
utilidad que escribí (y, por supuesto, todavía uso) a fines de la década de 1980. Probablemente se inspiró en lamake
utilidad, ya que la primera opción que agregué fue-n
.Para el ejemplo dado, se usaría así:
Otras lecturas:
copy - utilidad de copia de archivo / directorio
Entrada de registro de cambios de agosto de 1988 :
fuente
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:
y por supuesto si quieres copiarlos usa:
fuente
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.
le mostrará todo lo que se haría, y
lo haré.
fuente