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.


¿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/

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"

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.