Compare dois diretórios para uma determinada extensão e mova os que faltam para um novo diretório

Compare dois diretórios para uma determinada extensão e mova os que faltam para um novo diretório

Editando e alterando o palavreado para torná-lo mais claro - Tenho arquivos .dm4 em dirA e dirB. Minha pasta de referência é dirA e quero listar todos os arquivos .dm4 que estão faltando em dirA que estão em dirB e depois postar todos os .dm4s ausentes e junto com os .dm4s existentes do diretório A, no diretório C, garantindo assim que não perco nenhum .dm4s que possa existir em meu dirA e dirB.

Responder1

Vamos estabelecer algumas suposições:

  • Sua concha ébash
  • SeuDiretório AédirA
  • SeuDiretório BédirB
  • SeuDiretório Cainda não existe, mas será nomeadodirC
  • Todos os arquivos de seu interesse existem dirAou dirBpossivelmente estão duplicados nesses diretórios

A maneira mais simples que consigo pensar é:

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

Isso colocará todos os arquivos .dm4 dirCe produzirá uma difflista dos dois diretórios.

Se você precisar de um nível de detalhe maior que esse, por favoredite sua perguntapara ser mais específico.

ATUALIZAR:

Suponha que você tenha estes arquivos:

$ 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 alguns arquivos estão duplicados, alguns estão apenas em dirA, outros estão apenas em dirB. Nenhum dos diretórios possui um cherry.dm4arquivo, pelo que vale a pena.

E também suponha que você tenha um 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.shproduz:

$ ./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

A diffsaída informa que os arquivos .dm4 ausentes dirAsão elderberry, grapee huckleberry. Todos os arquivos encontrados emdirA ou dirBestão presentes em dirC.

Responder2

Copie todos os arquivos de dirA para dirC

cp dirA/*.dm4 dirC

Em seguida, copie todos os arquivos do dirB, ignorando os arquivos existentes no 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: -nverifica apenas nomes de arquivos, para verificar versões, a -uopção pdate pode ser interessante.

informação relacionada