2017-09-13 91 views
0

我有一个问题。这是我家庭作业的一部分,我真的不知道该怎么做。 我有一个存档,其中包含目录树和一个名为sumy.md5的文件。我必须搜索此树中的每个文件,并检查它们的校验和是否也在sumy.md5文件中。如果他们是我必须将他们移动到另一个目录。 我会很感激,如果有人能告诉我如何通过整个目录,并检查文件的校验和是否也在文件中sumy.md5Unix。目录中所有文件的校验和及其子目录

我到目前为止试过的代码。

for f in (find ./AA/* -type f) 
while read -r file; 
do 
b=$(md5sum $file | cut -d' ' -f1) 
if [ $a == $b ] then 
    echo "Found It" 
    else echo "File not found" 
fi 
done < sumy.md5 
+0

到目前为止您尝试过什么?这听起来像一个简单的bash脚本将工作 – BurnsBA

+0

为f(找到./AA/*-type f) 而读取-r文件;做 B = $($的md5sum文件|切-d”'-f1) 如果[$ A == $ B] 然后 回声 “发现” 其他 回声 “找不到文件” 网络 做< sumy.md5 –

+0

编写代码是作业的一部分。有时被忽视的是将问题分解成更小的部分的技巧。听起来好像你的作业有几个步骤:(1)浏览一个目录树,(2)检查文件的md5,(3)决定是否移动文件,以及(4)移动文件。你有哪些部分有问题? – stealththeninja

回答

1

有一些问题,你的脚本。复制您的评论和格式:

# the following line has a syntax error (missing "$") 
# but it's also not used in the loop 
for f in (find ./AA/* -type f) 
# syntax error here trying to jump into the while loop 
while read -r file; do 

    b=$(md5sum $file | cut -d' ' -f1) 

    # the variable "a" is never defined 
    if [ $a == $b ] 
    then 
     echo "Found It" 
    else 
     echo "File not found" 
    fi 
done < sumy.md5 

以上似乎文件遍历目录(错误地),然后在sumy.md5文件的每一行迭代。如果从md5sum输出md5内容,那么你可能只需要使用--check选项,但如果不是,那么使用类似grep的内容来搜索内容更容易。

for file in $(find ./AA/* -type f) 
do 
    b=$(md5sum $file | cut -d' ' -f1) 

    # "q" just exits with status code, 0 or 1 on found or not 
    # "i" says to ignore case 
    if grep -qi "$b" "sumy.md5" 
    then 
     echo "Found It" 
    else 
     echo "File not found" 
    fi 
done 

如果发现,使用类似cp --parents也许rsync要复制文件到任何目录,这也将无需手动处理它创建所需的目录结构。

+1

谢谢你,先生:)你的版本似乎更好,更容易。这真的很有帮助。我甚至没有考虑过grep。我将学习如何使用正确的粘贴代码格式,但我的考试即将到来,现在我没有太多时间。还有一个问题。我还必须制作移动文件的符号链接。符号链接中的路径必须是相对的。 –

相关问题