Como diferenciar nomes de arquivos em dois diretórios (sem gravar em arquivos intermediários)?

31

Estou tentando fazer algo ao longo das linhas de:

diff `ls -1a ./dir1` `ls -1a ./dir2`

Mas isso não funciona por razões óbvias. Existe uma maneira melhor de conseguir isso (em 1 linha) do que isso?

ls -1a ./dir1 > lsdir1
ls -1a ./dir2 > lsdir2
diff lsdir1 lsdir2

obrigado

bguiz
fonte

Respostas:

47

Você estava perto. No bash, você deseja a substituição do processo , não a substituição do comando:

diff <(ls -1a ./dir1) <(ls -1a ./dir2)
Ignacio Vazquez-Abrams
fonte
A substituição do processo não é necessária, no entanto. A resposta abaixo ( superuser.com/a/228773/566289 ) está no ponto!
Jan D
Exceto que a resposta difere o conteúdo, não os nomes dos arquivos!
perdido
10
diff -rq dir1 dir2

usando a opção -r, percorra árvores de diretório inteiras, verificando recursivamente as diferenças entre subdiretórios e arquivos que ocorrem em pontos comparáveis ​​em cada árvore. O truque é usar a opção -q para suprimir comparações linha a linha

fseto
fonte
3
@festo : You wree missing the poitn of this question, I don't actually want to diff the contents of the files, I want to diff the output of the ls commands
bguiz
+1, na verdade, obtive a mesma saída com uma ressalva, diff -rq relatou um arquivo vinculado como 'Nenhum arquivo ou diretório'. Portanto, mais um para uso correto e francamente mais simples. (mesmo que a resposta do IVA seja uma melhor 'oportunidade de aprendizado' para substituição de processos (> _ <)
xtian 18/10/2013
1
Isso é muito mais lento que diferenciar os nomes dos arquivos: a totalidade de cada arquivo deve ser lida e comparada.
Zaz
@ Josh é claro, porque ele faz de forma recursiva ....
Braiam
1
@ Braiam: Mesmo que você diferencie recursivamente os nomes dos arquivos (usando rsynccom a --dry-runopção, por exemplo), ainda assim seria muito mais rápido que diff -r.
Zaz