Localiza arquivos em um diretório não em outro

6

Existe alguma ferramenta Linux / Unix que encontre todos os arquivos em um diretório não presente em outro? Basicamente eu estou procurando diff que funciona na saída de ls.

Scripts curtos e doces também são apreciados.

    
por Willi Ballenthin 01.09.2010 / 17:36

8 respostas

12

diff já faz isso:

diff dir1 dir2

Exemplo de saída:

Only in dir1: some_file.txt
Only in dir1: some_other_file.txt
Only in dir2: third_file.txt
    
por 01.09.2010 / 17:50
7

Bash:

diff <(cd dir1; ls) <(cd dir2; ls)

Compare apenas os nomes dos arquivos - não o conteúdo dos arquivos.

    
por 01.09.2010 / 18:32
3

Como as pessoas disseram aqui, você pode usar o DIFF em várias variações de uso. Ou você apenas usa dirdiff , o que significa o que você está tentando! : -)

Mas se você quiser manter alguns diretórios em sincronia, deve dar uma olhada em rsync .

Atenciosamente

    
por 01.09.2010 / 18:36
1

for i in $(ls -1 directory1); do if (test -f directory2/$i) then echo $i; fi; done

    
por 01.09.2010 / 17:42
1

Se você quiser fazer isso em todos os subdiretórios, uma boa maneira de fazer isso é:

diff --brief -r dir1/ dir2/

Eu prefiro usar o brief, mas você pode deixar isso de lado se quiser.

    
por 22.03.2017 / 20:29
0

Isso funciona ..

ls -a1 /dir1 | sort > /tmp/1
ls -a1 /dir2 | sort > /tmp/2
diff /tmp/1 /tmp/2
    
por 01.09.2010 / 17:39
0

não testado:

find /dir/A -printf "%P" | while read f; do
  if [ ! -e "/dir/B/$f" ]; then
    echo $f
  fi
done
    
por 01.09.2010 / 17:41
0

Dennis Williamson tinha uma boa resposta , mas eu precisava fazer isso de forma recursiva. GNU findutils 4.7.0 não classifica sua saída, então aqui está o que eu usei

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort)

Para fazer isso apenas de uma maneira e produzir uma lista de arquivos, usei isto:

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort) \
| grep '< ./' | sed "s,< ./,$dir1/,"

Para que isso funcione corretamente, nem $ dir1 nem $ dir2 devem incluir a barra final.

    
por 04.09.2017 / 13:58