Compare dos directorios para una determinada extensión y luego mueva los que faltan a un nuevo directorio

Compare dos directorios para una determinada extensión y luego mueva los que faltan a un nuevo directorio

Editando y cambiando la palabrería para que quede más claro. Tengo archivos .dm4 tanto en dirA como en dirB. Mi carpeta de referencia es dirA y quiero enumerar todos los archivos .dm4 que faltan en dirA que están en dirB y luego publicar todos los .dm4 faltantes y junto con los .dm4 existentes del directorio A, en el directorio C, asegurándome así que no me pierda ningún .dm4 que pueda existir en mi dirA y dirB.

Respuesta1

Establezcamos algunas suposiciones:

  • Tu caparazón esbash
  • SuDirectorio AesdirA
  • SuDirectorio BesdirB
  • SuDirectorio Caún no existe, pero será nombradodirC
  • Todos los archivos que le interesan existen dirAo dirBposiblemente estén duplicados en esos directorios.

La forma más sencilla que se me ocurre es:

rm -rf dirC; mkdir dirC
cp -p dirB/*.dm4 dirC/
cp -p dirA/*.dm4 dirC/
diff <(ls dirA) <(ls dirB)

Eso colocará todos los archivos .dm4 dirCy producirá una difflista de los dos directorios.

Si necesita un nivel de detalle mayor que ese, por favoredita tu preguntapara ser más especifico.

ACTUALIZAR:

Supongamos que tiene estos archivos:

$ ls -1 dir{A,B}/*
dirA/apple.dm4
dirA/banana.dm4
dirA/date.dm4
dirA/fig.dm4
dirB/apple.dm4
dirB/elderberry.dm4
dirB/fig.dm4
dirB/grape.dm4
dirB/huckleberry.dm4

Observe que algunos archivos están duplicados, algunos solo están en formato dirA, otros solo están en formato dirB. Ninguno de los directorios tiene un cherry.dm4archivo, por si sirve de algo.

Y supongamos también que tienes un script foo.sh:

$ cat << EOF > foo.sh; chmod 755 foo.sh
#!/usr/bin/env bash
rm -rf dirC; mkdir dirC
cp -p dirB/*.dm4 dirC/
cp -p dirA/*.dm4 dirC/
diff <(ls dirA) <(ls dirB)
EOF

Correr foo.shproduce:

$ ./foo.sh
2,3c2
< banana.dm4
< date.dm4
---
> elderberry.dm4
4a4,5
> grape.dm4
> huckleberry.dm4
$ ls -1 dirC/*
dirC/apple.dm4
dirC/banana.dm4
dirC/date.dm4
dirC/elderberry.dm4
dirC/fig.dm4
dirC/grape.dm4
dirC/huckleberry.dm4

El diffresultado le indica que los archivos .dm4 que faltan dirAson elderberry, grapey huckleberry. Todos los archivos encontrados endirA o dirBestán presentes en dirC.

Respuesta2

Copie todos los archivos de dirA a dirC

cp dirA/*.dm4 dirC

Luego copie todos los archivos de dirB, omitiendo los archivos existentes en dirC

cp -n dirB/*.dm4 dirC/

Página de manual para cp:

  -n, --no-clobber
         do not overwrite an existing file (overrides a previous -i
          option)

Nota: -nsolo busca nombres de archivos; para buscar versiones, la -uopción pdate puede ser interesante.

información relacionada