我从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先进!
答案 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
古德勒克。