Estou tentando encontrar os arquivos existentes em um diretório, mas não no outro, tentei usar este comando:
diff -q dir1 dir2
O problema com o comando acima em que ele encontra os arquivos, dir1
mas não está dir2
, assim como os arquivos, dir2
mas não está dir1
,
Estou tentando encontrar os arquivos, dir1
mas não dir2
apenas.
Aqui está uma pequena amostra da aparência dos meus dados
dir1 dir2 dir3
1.txt 1.txt 1.txt
2.txt 3.txt 3.txt
5.txt 4.txt 5.txt
6.txt 7.txt 8.txt
Outra pergunta em minha mente é como encontrar os arquivos, dir1
mas não em dir2
ou dir3
em um único comando?
grep
de^dir1
ter certeza de nãodir1
aparecer mais tarde no caminho.$4
como exemplo. De fato, no meu Ubuntu atual,diff
responde em italiano.$4
é ok para as respostas italiano e inglês, mas eu não tenho certeza que para cada outras línguas ...Isso deve fazer o trabalho:
Opções explicadas (através da página do manual diff (1) ):
-r
- Compare recursivamente todos os subdiretórios encontrados.-q
- Saída apenas se os arquivos diferirem.fonte
diff -rq dir1 dir2 | grep 'Only in dir1/'
-q
opção: As páginas de manual dizem apenas "Saída apenas se os arquivos diferem", não como ele verifica se são diferentes. Examinei o código-fonte e descobri que ele apenas verifica os tamanhos dos arquivos para determinar diferenças, não o conteúdo real.-q
opção, não posso reproduzir que apenas verifique o tamanho do arquivo. Usando o GNU Diffutils 3.7, comparando dois arquivos com o mesmo tamanho, mas com conteúdo diferente comdiff -q file1 file2
saídasFiles file1 and file2 differ
.Este comando fornecerá os arquivos que estão no diretório1 e não no diretório2.
Sobre o
<( )
sinal, você pode pesquisar no Google como 'substituição de processo'.fonte
(ls -R dir1|sort)
poderia fazer o truque(ls -R dir|sort)
.vimdiff <(ls dir1 |sort) <(ls dir2|sort)
Uma boa maneira de fazer essa comparação é usar
find
commd5sum
, então adiff
.Exemplo:
Use
find
para listar todos os arquivos no diretório, calcule o hash md5 para cada arquivo e envie-o para um arquivo:Faça o mesmo procedimento para o outro diretório:
Em seguida, compare o resultado dois arquivos com "diff":
Essa estratégia é muito útil quando os dois diretórios a serem comparados não estão na mesma máquina e você precisa garantir que os arquivos sejam iguais nos dois diretórios.
Outra boa maneira de fazer o trabalho é usar git
Cumprimentos!
fonte
O Meld ( http://meldmerge.org/ ) faz um ótimo trabalho na comparação de diretórios e arquivos.
fonte
O plugin DirDiff do vim é outra ferramenta muito útil para comparar diretórios.
Ele não apenas lista quais arquivos são diferentes entre os diretórios, mas também permite que você inspecione / modifique com vimdiff os arquivos que são diferentes.
fonte
Insatisfeito com todas as respostas, como a maioria delas trabalha muito lentamente e produz uma saída desnecessariamente longa para diretórios grandes, escrevi meu próprio script Python para comparar duas pastas.
Ao contrário de muitas outras soluções, ele não compara o conteúdo dos arquivos. Além disso, ele não entra em subdiretórios ausentes em outro diretório. Portanto, a saída é bastante concisa e o script funciona rápido.
Uso da amostra:
Ou se você deseja ver apenas os arquivos do primeiro diretório:
PS Se você precisar comparar tamanhos de arquivo e hashes de arquivo para possíveis alterações, publiquei um script atualizado aqui: https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779
fonte
Outra abordagem (talvez mais rápida para diretórios grandes):
O
sed
comando remove o primeiro componente do diretório, graças à postagem de Erik )fonte
find
portanto, um comentário e não uma resposta separada):cd dir2; find . -exec [ -e ../dir1/{} ] \; -o -print 2>/dev/null
Isso imprimirá arquivos presentes no dir2, mas não presentes no dir1.Isso é um pouco tarde, mas pode ajudar alguém. Não tenho certeza se diff ou rsync cuspir apenas nomes de arquivos em um formato simples como este. Agradeço ao plhn por fornecer a solução legal que expus abaixo.
Se você quiser apenas os nomes dos arquivos, para facilitar a cópia dos arquivos necessários em um formato limpo, use o comando find.
Isso pressupõe que dir1 e dir2 estão na mesma pasta pai. O sed apenas remove a pasta pai para que você possa comparar maçãs com maçãs. O último sed apenas coloca o nome dir1 de volta.
Se você apenas deseja arquivos:
Da mesma forma para diretórios:
fonte
cd
antes dafind
vez de ter que usarsed
, por exemplo:comm -23 <(cd dir1 || exit; find -type f | sort) <(cd dir2 || exit; find -type f | sort)
. (Asexit
s estão aqui para evitarfind
de usar o diretório atual devecd
falhar.)comm
with support-z
(fornecida com git.savannah.gnu.org/cgit/coreutils.git/commit/… ), poderá fazê-locomm -23 -z <(cd dir1 && find -type f -print0 | sort -z) <(cd dir2 && find -type f -print0 | sort -z)
. (Nesse meio tempo eu também descobri que asexit
s poderiam ser substituídos.)A resposta aceita também listará os arquivos existentes nos dois diretórios, mas com conteúdo diferente. Para listar apenas os arquivos que existem no dir1, você pode usar:
Explicação:
fonte
Esta resposta otimiza uma das sugestões do @ Adail-Junior adicionando a
-D
opção, o que é útil quando nenhum dos diretórios comparados é repositório git:Se você usar
-D
, não verá comparações com/dev/null
:text Binary files a/whatever and /dev/null differ
fonte
Uma maneira simplificada de comparar 2 diretórios usando o comando DIFF
abra filename.dat após a conclusão da execução
e você verá: Only in filename.1: filename.2 Only in: directory_name: name_of_file1 Only in: directory_Name: name_of_file2
fonte
Este é o script bash para imprimir comandos para sincronizar dois diretórios
fonte
GNU
grep
pode inverter a pesquisa com a opção-v
. Isso torna ogrep
relatório das linhas, que não coincidem. Com isso, você pode remover os arquivosdir2
da lista de arquivosdir1
.As opções
-F -x
indicamgrep
para executar uma pesquisa de string em toda a linha.fonte