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.

Willi Ballenthin
fonte

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
tobym
fonte
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
10

Bater:

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

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

Pausado até novo aviso.
fonte
Também ksh e zsh.
Pausado até novo aviso.
use rsync para dirs de sincronização
c4f4t0r 4/17
Não analise ls, use em findvez disso!
val diz Reintegrar Monica
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

Jan.
fonte
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.

trueCamelType
fonte
1

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

James L
fonte
0

Isso funciona..

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

não testado:

find /dir/A -printf "%P" | while read f; do
  if [ ! -e "/dir/B/$f" ]; then
    echo $f
  fi
done
Javier
fonte
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.

sondra.kinsey
fonte