Copie archivos que no existen en el directorio superior

0

Actualmente sé cómo copiar archivos que no existen en el directorio de destino. Esto me permite copiar de src a dstcomo me gustaría.

Sin embargo, ahora quiero copiar de srca dst/2016-01-05, pero sólo en los archivos srcque no existen en cualquier lugar dentro dst.

Ejemplo

Supongamos que la situación de inicio es

src/f1.txt
src/f2.txt
src/f3.txt

dst/2016-01-04/f1.txt
dst/2016-01-05/f0.txt

Luego, después de hacer la copia, la situación final debería ser:

src/f1.txt
src/f2.txt
src/f3.txt

dst/2016-01-04/f1.txt
dst/2016-01-05/f0.txt

dst/2016-01-05/f2.txt
dst/2016-01-05/f3.txt

En general, no me gustaría sobrescribir los archivos existentes. Incluso si la fuente se actualiza.

Dennis Jaheruddin
fuente
¿Hay subdirectorios en src/? Si es así, ¿cómo se manejan dst/? ¿Está el directorio codificado por fecha inmediatamente debajo dst/o entre el directorio de origen y el archivo de destino?
AFH
@AFH No hay subdirectorios en src. En el dstdirectorio, crearé una carpeta con la fecha actual, por ejemplo dst/2016-01-04, y pondré todos los archivos allí que aún no existían dst. (No quiero depender de cuánto tiempo han existido los archivos src)
Dennis Jaheruddin

Respuestas:

1

Lo siguiente debería hacer el truco: -

today=`date +%Y-%m-%d`
ls -A src/ | while f=`line`; do if [ ! -f "dst/*/$f" ]; \
                 then mkdir -p "dst/$today"; cp "src/$f" "dst/$today/$f"; fi; done

Notas:

  1. En comparación con la alternativa de for f in src/*; ..., el uso lselimina el directorio del nombre de origen e -Aincluye los nombres de archivo que comienzan con .,.
  2. Si hay subdirectorios src/, deberá usarlos finden el directorio de origen y quitar src/el nombre con -printf %P\\n.
  3. Si no tiene el linecomando que puede usar while read f; ..., pero esto no funciona para los nombres de archivo con espacios en blanco iniciales y finales (incluso linefalla si el nombre del archivo contiene un carácter de nueva línea; para esto necesitaría usar find -print0y xargs -0).
AFH
fuente