
¿Hay alguna manera de que cp
la --update
opción imprima archivos que no se copiaron porque el directorio de origen contenía una versión más nueva del archivo?
Respuesta1
Reemplazar cp -ur
con rsync -urvv
.
Las dos "v" no son un error tipográfico: están ahí para aumentar la detalle, para mostrar los archivos que se omitieron.
Los archivos omitidos se verán así the_filename is newer
, así que para obtener la lista de archivos omitidos puedes usar esta frase:
rsync -urvv source/ target | grep ' is newer$' | sed -e 's/ is newer$//'
O si lo va a utilizar de forma interactiva, la --progress
bandera puede resultar muy útil.
Respuesta2
No creo que haya una manera de hacerlo cp
directamente, pero debería hacer esencialmente lo mismo:
cp -vu file destination | awk '{ gsub("[`\x27]", "", $1); print $1 } END { if (NR == 0) print "NOFILES" }' | xargs -I{} find . ! -name {} -maxdepth 1
Esta pequeña frase tiene algunas limitaciones:
1) Depende de que no exista ningún archivo llamado "NOFILES". Puede cambiar esa cadena en el awk
comando para adaptarla a sus necesidades.
2) Debes estar en el directorio donde file
existe. Si no está en ese directorio, debe cambiar el find
comando para que sea find dirWhereFileExists
en lugar de. find .
Si no está copiando desde un solo directorio, puede usarlo find dir1 dir2...
en su lugar.
3) No funcionará si por alguna razón tiene comillas invertidas o comillas simples en los nombres de sus archivos.
Como puede ver, esta no es la solución más sólida, pero debería funcionar para una operación única.
EDITAR
Me desperté esta mañana y me di cuenta de que la solución anterior era basura. Si intenta copiar varios archivos, buscará tantas veces como archivos tenga, excluyendo un archivo cada vez. Sin embargo, la siguiente solución debería funcionar:
cp -vu file destination | awk '{ gsub("[`\x27]", "", $1); regex = $1 "|" regex } END { if (NR == 0) { regex = "NOFILES|" } print ".*/("substr(regex, 0, length(regex))")" }' | xargs -I{} find . -regextype posix-extended ! -regex {} -maxdepth 1
Crea una expresión regular a medida que avanza y se la pasa a find
su lugar. Se aplican las mismas limitaciones que las anteriores.
Perdón por el pedo cerebral de antes. Supongo que ya era demasiado tarde para estar en StackOverflow.
Respuesta3
¿rsync haría el trabajo por ti? Tiene muchas opciones que se ajustan a su descripción, como "no sobrescribir archivos más nuevos" y demás. Y puede hacer que registre los hallazgos. Lo uso a menudo para copiar archivos locales y remotos.
También puedes volverte muy granular con él.
Buena suerte.