检查 2 个目录之间的文件总和

检查 2 个目录之间的文件总和

我想检查两个目录之间的文件校验和。

我编写了以下脚本来执行此操作:

#!/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

该脚本工作正常,直到遇到名称中带有空格的文件,此时我收到错误。

我尝试通过“转义”文件名来解决这个问题,如下所示:

tgt_file=${file_name// /\\ }

不幸的是,这会在读取文件名时导致错误。

我已经搜索过,但没有找到似乎有效的答案。任何建议都将非常受欢迎。谢谢。

答案1

你不双引号你的任何变量。双引号字符串(包括带有变量的字符串)将导致它们被视为单个标记。否则,它们将被视为空格分隔的标记列表。即使空格出现在之后,这也适用参数扩展- 正如您的情况所发生的那样。

有关为什么这很重要的进一步讨论,请参阅以下帖子:

您的脚本可能如下所示:

#!/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

您会注意到我引用了字符串和变量。严格来说,这在这里并不是真正必要的,但养成引用您想要视为单个标记的所有内容的习惯可能会很好。

我还为您的变量使用了大括号语法。同样,在这种情况下这可能没有必要,但我认为这是一般的最佳实践。有关大括号语法的进一步讨论,请参阅以下帖子:

答案2

diff -q <(ls -1 $dir1 | wc -l) <(ls -1 $dir2 | wc -l)

LS -1给你一个文件列表,每行 1 个

厕所-l数一下行数

编辑:

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

相关内容