Encontre arquivos em um diretório e não em outro


12

Existem ferramentas Linux / Unix que encontram todos os arquivos em um diretório que não estão presentes em outro? Basicamente, estou procurando diff que funciona na saída de ls.

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

Respostas:


20

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

5
Isso é bom. Uma queixa: diff está em execução em cada um dos arquivos que estão em ambos. Existe uma opção obscura para executar apenas nomes de arquivos (eu posso ter esquecido)? Caso contrário, eu sugirodiff dir1 dir2 | grep "Only"
Willi Ballenthin

wow isso me poupar muitos minutos de scripts bash obrigado
user5359531 18/02


4

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

Mas se você deseja manter alguns diretórios sincronizados, deve dar uma olhada rsync.

Saudações


3

Se você deseja fazer isso através de todos os subdiretórios também, uma boa maneira de fazer isso é:

diff --brief -r dir1/ dir2/

Eu prefiro usar breve, mas você pode deixar isso de fora, se quiser.


1

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


0

Isso funciona..

ls -a1 /dir1 | sort > /tmp/1
ls -a1 /dir2 | sort > /tmp/2
diff /tmp/1 /tmp/2

0

não testado:

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

0

Dennis Williamson teve uma boa resposta , mas eu precisava fazer isso recursivamente. O 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 o seguinte:

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.