Verificando Soma de Arquivo entre 2 diretórios

1

Gostaria de verificar as somas de verificação de arquivos entre dois diretórios.

Eu escrevi o seguinte script para fazer isso:

#!/bin/bash

echo Checking File Copy

SRC_DIR=/home/user/src

echo Source Directory: $SRC_DIR

TGT_DIR=/media/user/tgt

echo Target Directory: $TGT_DIR

cd $SRC_DIR

for file_name in *.txt
do
 echo $file_name
 tgt_file=${file_name// /\ }
 sum $TGT_DIR/$tgt_file
 sum $file_name
done

O script funciona bem até encontrar um arquivo com espaço no nome, no ponto em que recebo um erro.

Eu tentei resolver isso "escapando" o nome do arquivo da seguinte forma:

tgt_file=${file_name// /\ }

Infelizmente, isso causa um erro ao ler os nomes dos arquivos.

Eu pesquisei, mas não encontrei uma resposta que pareça funcionar. Qualquer sugestão seria muito bem vinda. Obrigado.

    
por earnshae 11.11.2017 / 17:20

2 respostas

3

Você não está citando duas vezes qualquer uma das suas variáveis. Duplicar suas strings (incluindo strings com variáveis) fará com que elas sejam tratadas como um único token. Caso contrário, eles serão tratados como listas delimitadas por espaços em branco de tokens. Isso se aplica mesmo se o espaço em branco ocorrer após expansão de parâmetro - como está acontecendo na sua situação.

Para uma discussão mais aprofundada sobre por que isso é importante, veja o seguinte post:

Veja a aparência do seu script:

#!/bin/bash

echo "Checking File Copy"

SRC_DIR="/home/user/src"

echo "Source Directory: ${SRC_DIR}"

TGT_DIR="/media/user/tgt"

echo "Target Directory: ${TGT_DIR}"

cd "${SRC_DIR}"

for file_name in *.txt
do
 echo "${file_name}"
 sum "${TGT_DIR}/${file_name}"
 sum "${file_name}"
done

Você notará que eu citei as strings assim como as variáveis. Estritamente falando, isso não é realmente necessário aqui, mas provavelmente é bom ter o hábito de citar tudo o que você deseja considerar como um único token.

Eu também usei a sintaxe de chaves para suas variáveis. Novamente, isso provavelmente não é necessário nesta situação exata, mas eu consideraria isso uma prática recomendada em geral. Para mais discussões sobre a sintaxe de chaves, veja o seguinte post:

por 11.11.2017 / 17:26
0
diff -q <(ls -1 $dir1 | wc -l) <(ls -1 $dir2 | wc -l)

ls -1 fornece uma lista de arquivos, 1 linha por linha

wc -l conta as linhas

EDITAR:

for file in $(sort -u <(ls -1 $dir1/; ls -1 $dir2/)); do echo $file; diff -q <(checksumcommand $dir1/$file) <(checksumcommand $dir2/$file); done
    
por 11.11.2017 / 21:46