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 -q
opção:
diff -r -q dir1 dir2
Responder2
Emulando como ferramentas como comm
ou join
comparariam 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 bash
matrizes 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.