Copie cada archivo en una estructura de directorio en una ruta específica solo si el archivo no existe allí

8

Me gustaría copiar cada archivo de una estructura de directorio a un directorio específico solo si el archivo no existe allí.

Obtuve la primera parte de esta pregunta de desbordamiento de pila :

find . -type f -exec cp {} /target-directory \;

¿Cómo puedo verificar si el archivo existe o no? Si no, copie el archivo, de lo contrario, omita.

señor au
fuente
¿Quiere decir "copiar todos los archivos en el árbol de origen en un directorio único (específico) sin subdirectorios"? ¿O "copie todos los archivos en el árbol de origen en un subdirectorio del directorio de destino similar a donde estaba en el árbol de origen"? Leí la pregunta como primer caso. ¿Puede editar la pregunta para aclararla? (Sé que tiene su respuesta, pero será leída y utilizada por otros.)
Volker Siegel

Respuestas:

13

Puede usar el -uinterruptor del cpcomando:

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

o use el rsynccomando con --ignore-existing:

omitir la actualización de archivos que existen en el receptor

Ejemplo:

rsync --ignore-existing source/* destination/
Ravexina
fuente
3

Su comando original se puede reescribir como:

find . -type f -exec bash -c 'test -e /target-directory/"$1" || cp "$1" /target-directory' sh {} \;

La clave aquí es que llamamos a shell con comandos específicos y pasamos el archivo encontrado como $1argumento. Si test -e /target-directory/"$1"falla, eso significa que el archivo no existe, en cuyo caso cpcopiará el archivo.

En general, uno puede usar otros comandos, siempre que el comando pueda verificar la existencia de un archivo. Algunas de las otras alternativas:

  • /usr/bin/realpath -e /target-directory/"$1" > /dev/null || cp "$1" /target-directory
  • stat >/dev/null /target-directory/"$1" || cp "$1" /target-directory/"$1"
Sergiy Kolodyazhnyy
fuente
2
¿Por qué statprobar la existencia de archivos en Bash? ¿No test -esería mucho más simple?
David Foerster
@DavidFoerster No hay razón particular. el comando de prueba también lo hará. Editaré mi respuesta más tarde si no me olvido
Sergiy Kolodyazhnyy
0

Lea man cpy use la --no-clobberopción para cp.

Waltinator
fuente