Obtendo diferenças entre dois diretórios com detalhes completos

Obtendo diferenças entre dois diretórios com detalhes completos

Eu tenho dois diretórios e preciso da saída de suas diferenças neste formato

exemplo :

DIR1 conatins :   file1
                  file2
                  file3
DIR2 contains :   file1
                  file4

Saída (somente nomes de arquivos, sem conteúdo de arquivo): arquivo1 é modificado ou igual, arquivo2 é removido, arquivo4 é adicionado

Responder1

Essa é simples, confira a ferramenta popular diff: diff -r dir1 dir2 Editar: entendi errado a pergunta do OP, para obter apenas as informaçõesqueos arquivos diferem, nãocomoeles diferem, você precisa usar a -qopção: diff -r -q dir1 dir2

Responder2

Emulando como ferramentas como commou joincomparariam dois conjuntos de entradas classificadas, usando bash:

# Get lists of (base-)names from both directories.
files1=( dir1/* ); files1=( "${files1[@]##*/}" )
files2=( dir2/* ); files2=( "${files2[@]##*/}" )

# Loop over these sorted lists until one of them is empty.
while [[ ${#files1[@]} -gt 0 ]] && [[ ${#files2[@]} -gt 0 ]]; do
        name1=${files1[0]}
        name2=${files2[0]}

        if [[ $name1 == "$name2" ]]; then
                # Name exists in both directories.
                printf '%s is modified or same\n' "$name1"
                files1=( "${files1[@]:1}" )
                files2=( "${files2[@]:1}" )
        elif [[ $name1 < $name2 ]]; then
                # Name exists in only first directory.
                printf '%s is removed\n' "$name1"
                files1=( "${files1[@]:1}" )
        else
                # Name exists in only second directory.
                printf '%s is added\n' "$name2"
                files2=( "${files2[@]:1}" )
        fi
done

# Handle remaining names.
if [[ ${#files1[@]} -gt 0 ]]; then
        printf '%s is removed\n' "${files1[@]}"
fi
if [[ ${#files2[@]} -gt 0 ]]; then
        printf '%s is added\n' "${files2[@]}"
fi

Estou usando duas bashmatrizes para armazenar os nomes encontrados em cada diretório e, em seguida, itero até que uma dessas matrizes esteja vazia.

No loop, comparo o primeiro nome de cada array entre si. Se os nomes forem iguais, então o arquivo é o mesmo ou possivelmente foi modificado (o nome é então removido de ambas as matrizes).

Se o nome da primeira matriz for classificado antes do nome da segunda matriz (testado com <), o primeiro nome estará faltando no segundo diretório. Agora exclua o primeiro elemento do primeiro array.

Caso contrário, o nome do segundo array estará faltando no primeiro diretório. Agora exclua o primeiro elemento do segundo array.

Após o loop, um dos arrays ainda pode estar não vazio, então produza os nomes desse array, se necessário.

informação relacionada