Dada a festança, isso pode ser mais fácil, pois
$ comm <(ls -a dir1) <(ls -a dir2)
A <(command)
expressão executa o comando sobre um pipe e substitui uma /dev/fd
referência:
mress:10018 Z$ echo <(ls)
/dev/fd/11
Portanto, o comando acima é executado ls -a
em cada diretório e alimenta suas saídas como argumentos de arquivo para comm
, que gera até 3 colunas, indentadas por tabulação: entradas apenas na primeira, entradas em ambas, entradas na segunda. (Ou seja, se estiver nos dois, será recuado por uma guia, se apenas no segundo for recuado por 2 guias.) Você também pode suprimir colunas por número: comm -1 foo bar
exibe apenas as linhas em ambos e as linhas no segundo arquivo, o último recuado por uma guia. (Isso geralmente é usado suprimindo tudo, exceto a coluna que você deseja: comm -13 foo bar
mostra apenas as linhas em comum.)
Como você deseja aqueles no primeiro diretório, isso se traduz em
$ comm -23 <(ls -a dir1) <(ls -a dir2)
Se você precisar mais do que apenas se ele estiver presente, use diff -r
, o que produzirá diffs para os arquivos em comum e uma mensagem de uma linha para arquivos encontrados apenas em um ou outro.
ls
virá com todos os problemas com espaços em branco, guias, feeds de linha, backspaces e outros nomes de arquivos.ls -b
.find
. Mas minha principal reclamaçãofind
é que é uma marreta realmente pesada para golpear o que geralmente é uma mosca pequena.E aqui um script puro. Estes são os diretórios aeb:
Aqui está o comando:
resultado:
Troque aeb pelos arquivos em a, mas não em b. O ! é uma negação. -e testa a existência. Na prosa: "Teste se não existe o arquivo encontrado em um em ../b".
Nota: Você precisa mergulhar primeiro, para obter nomes sem 'a'. Para a segunda comparação, você precisa fazer o cd
../b
.fonte
Se você preferir uma ferramenta gráfica, use
pode ser necessário instalá-lo primeiro. Programas similares são
O comandante da meia-noite possui um
compare directories
comando incorporado, que funciona bem, se você não usar subdiretórios.fonte
Você pode usar o
join
comando negligenciado . Aqui, alguma configuração para dois diretórios de exemplo, d1 / e d2 /, cada um com alguns arquivos com nomes exclusivos para o diretório e alguns com nomes em comum com o outro diretório. Este é apenas um exemplo, então usei nomes de arquivo com uma letra para ilustrar nomes de arquivos exclusivos para um ou outro e nomes de arquivos em comum.Para mim, mostra arquivos como este:
ATUALIZAÇÃO: Você gostaria de fazer coisas diferentes na vida real para acomodar arquivos com espaço em branco, pois
join
usa o primeiro campo "delimitado por espaço em branco" para decidir quais linhas são uniqe e quais são comuns.fonte
join -t ''
(sem delimitador) ajude esse caso.d2/f
masd2/f
. Guias e novas linhas nos nomes de arquivos são raras, mas permitidas.Você pode usar
find
eawk
resolver isso.Com o seguinte layout:
Parte um:
Parte dois:
Isso se compara a uma
comm
solução:E para uma
join
solução:fonte
use minhas funções:
fonte