Eu copiei uma pasta massiva de uma máquina Windows para uma máquina Linux e, como alguns nomes de arquivos são muito grandes (e alguns outros erros que eu ignorei), alguns arquivos não puderam ser copiados. Atualmente estou executando diff -r entre as duas pastas para gerar uma lista dos arquivos que estão na pasta original, mas não na cópia. No entanto, até agora as únicas coisas que parece ter reconhecido são pastas ausentes, ou seja, parece estar ignorando arquivos. Existe uma maneira melhor de fazer essa comparação? Em particular, estou preocupado que o Bash simplesmente não consiga reconhecer esses arquivos com nomes de arquivo muito longos.
linux
bash
debian
file-transfer
J. Min
fonte
fonte
diff -r
faz mudanças de arquivo captura, mesmo dentro em subdiretórios. Você pode preferir usar-ur
, no entanto. (Eu acho a saída muito mais inteligível dessa maneira.)Respostas:
Você pode fazer algo não totalmente diferente:
Eu não tentei isso, depende de metadados de arquivos (datas etc) sendo preservados (
cp -p ...
) e nals
classificação de nomes de arquivos na mesma ordem (o que deveria).fonte
some
eelse
ewhere
são apenas espaços reservados para os caminhos relativos para as duas pastas pai que você deseja comparar (incluindo comparando seus subdiretórios). por exemplocd /home/jmin/catpics
ecd /home/jmin/copy_of_catpics
ou o que for.diff --recursive
(-r
) captura alterações de arquivo, mesmo dentro de subdiretórios.Você pode preferir usar
diff --unified --recursive
, no entanto. Ele cria um diff unificado , que exibe linhas alteradas prefixadas com (+) para additon e (-) para remoção. Convenientemente, também exibe linhas circunvizinhas (ou seja, contexto ), para que você possa descobrir o que está acontecendo lá.fonte
diff -u -r
. Isso é louco! Você pode precisar de uma ferramenta que é otimizada para grandes conjuntos de arquivos, então. O rsync é provavelmente sua melhor aposta.Se o rsync for uma opção viável, talvez o
--itemize-changes
(-i) e as--dry-run
opções sejam úteis:rsync -zaic src_dir/ dest_dir/ --dry-run
-z compacta arquivos durante a transferência, -a copia no modo de arquivo e -c baseia as comparações de arquivos em somas de verificação em vez de data de modificação ou tamanho.
-i listará os arquivos individuais que são diferentes e --dry-run significa que nenhum dado será transferido, apenas gerando uma lista.
fonte
Isso é semelhante a essa outra resposta, mas:
find
para gerar listas de objetos (arquivos, diretórios); cabe aqui melhor do quels
porque sua saída contém apenas caminhos.sort
garante que a ordem relativa dos objetos seja preservada, independentemente de em que ordem cadafind
lista.<(…)
sintaxe evita arquivos temporários embash
.find
será executado somente se o correspondentecd
for bem-sucedido, graças ao&&
operador. Isso evitará que você executefind
no diretório atual se houver um erro de digitação em qualquer caminho.Notas Adicionais:
find
serão relativos aos diretórioscd
para nós . Certifique-se/first/path/
e/second/path/
corresponda um ao outro.diff
indica que os dois diretórios são idênticos; mas lembre-se…fonte
sdiff -s
, ao contráriodiff
, para mostrar apenas as diferenças das duas listas, ou seja, os arquivos que estão em um diretório e não no outro.