gpt4 book ai didi

linux - 如何比较两个目录以更新 BASH 中的日志文件?

转载 作者:太空宇宙 更新时间:2023-11-04 04:03:17 24 4
gpt4 key购买 nike

我试图比较两个目录,然后在确定两个目录之间的文件不同后更新日志文件,但我不断收到错误消息,指出它需要行 [ if $userinput -eq $userinput.log ] 中的整数结果。有没有办法比较我缺少的这两个?这是我写的脚本。

userinput=$1
if [ ! -d "$userinput" ];
then
echo "Usage: dirlog.sh directory_name" 1>&2
exit 0
else
if [ ! -f "$userinput.log" ];
then
ls -l > $userinput.log
echo ".logfile created for $userinput"
elif [ -f "$userinput.log" ];
then
if [ $userinput -eq $userinput.log ]; #if they are different
then
differences=diff -rq $userinput $userinput.log
for file in $differences
do
echo "$file missing from directory $userinput"
done
else
echo "no files missing from directory $userinput"
fi
#Update this no matter what
ls -l > $userinput.log
echo "logfile updated for directory $userinput"
fi
fi

最佳答案

您可以使用 diff -r 命令比较两个目录。这将向您显示所有不同的文件,以及从一个目录到另一个目录缺少哪些文件。 --brief 选项或 --summary 选项将仅列出差异,而不列出文件内容。

现在,关于您的 if [ $userinput -eq $userinput.log ];...

在 shell 中,变量可以保存数字或字母数字数据。让我们看一下这样的事情:

foo="0456"
bar="456"

在上面,$foo$bar可以是字符串或数字。如果我将它们视为数字,那么它们是相等的。但是,如果它们是字符串,则它们不相等。

这是另一个例子:

foo="123"
bar="45"

哪个更大?同样,这取决于 $foo$bar 是否被视为字符串或数字。如果我用数字来对待它们,$foo 会更大。但是,如果我将它们视为文本字符串,则 $bar 会更大,因为 $bar 的第一个字符 4 位于 $foo 的第一个字符 1 之后。

那么,bash 如何知道我想要进行数字比较还是字符串比较?很简单,Bash 为我提供了两组不同的比较运算符。一种用于字符串,一种用于文本:

                    String   Numeric
------ -------
Equals = -eq
Greater Than > -gt
Less Than < -lt
Not equals != -ne
Greater Than/Equals >= -ge
Less Than/Equals <= -le

就您而言,您想要比较两个字符串并且您正在使用 -eq。这就是为什么您会收到 -eq 运算符需要数字结果的错误。顺便说一句,如果您使用的是 Bash 或 Kornshell,则应该继续使用双方括号 [[ ... ]]。这些不太容易出错,并且有一些更好的功能,例如模式匹配:

if [[ $userinput == "$userinput.log" ]]

但是,我强烈建议您使用 diff -r --brief 命令来比较两个目录。

关于linux - 如何比较两个目录以更新 BASH 中的日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22240516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com