我想检查两个目录之间的文件校验和。
我编写了以下脚本来执行此操作:
#!/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