shell脚本找不到该目录

时间:2016-11-01 23:28:13

标签: bash shell

我从shell脚本开始。我需要对很多文件进行校验和,所以我想使用shell脚本自动化该过程。 我对脚本做了:第一个脚本使用带有 egrep -v 的递归 ls 命令,它接收我输入的文件路径作为参数,这些命令保存在环境变量,用于转换字符串中的输出,后跟一个循环(for),用于在行中剪切输出的字符串,并在调用第二个脚本时将这些行作为参数传递;第二个脚本使用此参数并将它们作为参数传递给 hashdeep 命令,然后将其保存在另一个环境变量中,如前面的脚本中那样,将输出的命令转换为字符串并且使用IFS切割它们,最后我将感兴趣的行放在文本文件中。

输出结果为:

  

/home/douglas/Trampo/shell_scripts/2016-10-27-001757.jpg:没有这样的档案   或目录

     

---- Checksum文件:2016-10-27-001757.jpg   ---- Checksum HASH:

问题是:我将目录〜/ Pictures 设置为参数,但在输出错误中它们返回另一个目录,/ home / douglas / Trampo / shell_scripts / (自己的目录),在这种情况下,文件 2016-10-27-001757.jpg 位于〜/ Pictures 目录中,为什么脚本会自行运行?目录

第一个脚本:

#/bin/bash                                                      

arquivos=$(ls -R $1 | egrep -v '^d')

for linha in $arquivos
        do
                bash ./task2.sh $linha
        done

第二个脚本:

#/bin/bash                                              

checksum=$(hashdeep $1)
concatenado=''

for i in $checksum
        do
                concatenado+=$i

        done

IFS=',' read -ra ADDR <<< "$concatenado"

echo
echo '----Checksum FILE:' $1
echo '----Checksum HASH:' ${ADDR[4]}
echo
echo ${ADDR[4]} >> ~/Trampo/shell_scripts/txt2.txt

我认为......抱歉英语语法错误。 我希望这个问题变得清晰。 谢谢ins先进!

1 个答案:

答案 0 :(得分:1)

仅第一个脚本就有几个错误。

使用ls以递归模式运行-R时,每个目录都会列出输出,并且每个文件都是相对于父项而不是完整路径名列出的。

ls -R没有列出| grep -v ^d隐含的长格式目录,而您似乎在寻找文件(非目录)。

在您的特定情况下,丢失的文件2016-10-27-001757.jpg位于子目录中,但您使用ls -R丢失了该位置。

不解析ls的输出。使用find并且您不会遇到同样的问题。

第一个脚本可以用一行代替。

试试这个:

#!/bin/bash
find $1 -type f -exec ./task2.sh "{}" \;

或者,如果您更喜欢使用xargs,请尝试以下操作:

#!/bin/bash
find $1 -type f -print0 | xargs -0 -n1 -I{} ./task2.sh "{}"

注意:将{}括在引号中可确保task2.sh收到完整的文件名,即使它包含空格。

task2.sh中,参数$1也应引用"$1"

如果task2.sh可执行,那么您已经完成了设置。如果没有,请在行中添加bash,使其显示为:

find $1 -type f -exec bash ./task2.sh "{}" \;

task2.sh虽然未在原始问题中发布,但却无法执行。它缺少execute权限。

通过运行chmod添加执行权限,如:

chmod a+x task2.sh

古德勒克。