Linux 文件监视Bash脚本

Linux 文件监视Bash脚本,linux,bash,shell,scripting,Linux,Bash,Shell,Scripting,我创建此脚本是为了检查特定文件是否存在于给定位置。但当我运行它时,它总是显示 失败-标志\u lms\u设备\u信息\u 20160628.txt不存在 失败-标记\ lms \每周\使用情况\信息\ 20160628不存在 但这两个文件都存在 PREFIX="/opt/data" REPORT="/tmp/report.txt" DATE=$( date -d "${dtd} -1 days" +'%Y%m%d' ) rm -f "$REPORT"

我创建此脚本是为了检查特定文件是否存在于给定位置。但当我运行它时,它总是显示

失败-标志\u lms\u设备\u信息\u 20160628.txt不存在
失败-标记\ lms \每周\使用情况\信息\ 20160628不存在

但这两个文件都存在

 PREFIX="/opt/data"
 REPORT="/tmp/report.txt"
 DATE=$( date -d "${dtd} -1 days" +'%Y%m%d' )

    rm -f "$REPORT"

                FILENAME="Flag_lms_device_info_${DATE}.txt"
                FULLFN="$PREFIX/$FILENAME"
                if [ -f "$FULLFN" ]; then
                        echo "OK - $FILENAME exists" >> $REPORT
                else
                        echo "Failed - $FILENAME do not exist" >> $REPORT
                fi

                FILENAME="Flag_lms_weekly_usage_info_${DATE}.txt"
                FULLFN="$PREFIX/$FILENAME"
                if [ -f "$FULLFN" ]; then
                        echo "OK - $FILENAME exists" >> $REPORT
                else
                        echo "Failed - $FILENAME do not exist" >> $REPORT
                fi
在这里,您可以检查名为
find
的奇怪文件是否存在。。。使用反引号

if [ -f `find "$FULLFN" -type f -name "$FILENAME"` ];then
或者,在
bash

if [ -f $(find "$FULLFN" -type f -name "$FILENAME") ];then
以字符串形式获取命令的输出

此外,您的
find
调用看起来并不乐观。如果您需要在
/opt/data/
下的某个位置查找名为
Flag\u lms\u device等的文件,请使用
find“$PREFIX”-键入f-name“$FILENAME”
。如果您确定
/opt/data
是准确的位置,请使用

if [ -f "$FULLFN" ]
您不需要
查找文件

在这里,您可以检查名为
find
的奇怪文件是否存在。。。使用反引号

if [ -f `find "$FULLFN" -type f -name "$FILENAME"` ];then
或者,在
bash

if [ -f $(find "$FULLFN" -type f -name "$FILENAME") ];then
以字符串形式获取命令的输出

此外,您的
find
调用看起来并不乐观。如果您需要在
/opt/data/
下的某个位置查找名为
Flag\u lms\u device等的文件,请使用
find“$PREFIX”-键入f-name“$FILENAME”
。如果您确定
/opt/data
是准确的位置,请使用

if [ -f "$FULLFN" ]

您不需要
查找文件。

首先,您的问题中有奇怪的输出:您的第二行输出缺少.txt扩展名。这可能是个意外,但如果不是,那就值得调查

假设date命令工作正常(我不知道该命令),我会减少变量的使用。此外,我将使用-e测试操作符而不是-f,因为它更具包容性。(如果尚未将数据放入文件中,-f可能会返回错误,即使文件存在):


首先,您的问题中有奇怪的输出:第二行输出缺少.txt扩展名。这可能是个意外,但如果不是,那就值得调查

假设date命令工作正常(我不知道该命令),我会减少变量的使用。此外,我将使用-e测试操作符而不是-f,因为它更具包容性。(如果尚未将数据放入文件中,-f可能会返回错误,即使文件存在):


另一方面,所有caps变量名都位于POSIX定义的命名空间中,供对shell或操作系统有意义的变量使用——用户提供的变量名应至少具有一个小写字符,以避免冲突。请参见第4段,记住环境变量和shell变量共享一个名称空间(这意味着即使您没有显式地命令shell导出它,使用与环境变量重叠的名称设置shell变量也会覆盖后者),所有caps变量名都位于POSIX定义的命名空间中,供对shell或操作系统有意义的变量使用——用户提供的变量名应至少具有一个小写字符,以避免冲突。请参见第4段,记住环境变量和shell变量共享一个名称空间(这意味着即使您没有显式地命令shell导出它,使用与环境变量重叠的名称设置shell变量也会覆盖后者)。OP是否编辑了问题以删除此答案所指的代码?顺便说一句,
$(…)
不是巴什主义;它在1992年发布的POSIX sh标准中有规定;因此,只有20世纪70年代伯恩(Bourne)的贝壳衍生物才需要回勾。好吧,在过去几十年中,唯一一家能够在操作系统中包含POSIX前shell的供应商是Sun,甚至他们最终也清理了这一点。是的,最初的问题是以双引号作为条件的
find
命令。感谢您关于backticks的注释,可能是我上次阅读bash手册的这一部分时,它是一些老式版本,就像古代Solaris的版本一样。>_nod,听起来不错——Sun可能是你坚持时间最长的公司,安装了一个原始的Bourne shell,名为
/bin/sh
,并在
/usr/xpg4/bin
或类似的地方安装了一个POSIX sh实例。Fun,Fun.BTW,即使与反勾号或
$()
组合使用,如果文件名有空格,引号仍然是避免字符串拆分的必要条件;例如,
[-f“$(查找“$FULLFN”-键入f-name“$FILENAME”)”]
。另外,如果文件位于使用
mkdir--'-a-z nonempty-a'
或类似恶意代码(在
test
语法的上下文中)创建的目录中,则会出现这种行为。OP是否编辑问题以删除此答案所指的代码?顺便说一句,
$(…)
不是巴什主义;它在1992年发布的POSIX sh标准中有规定;因此,只有20世纪70年代伯恩(Bourne)的贝壳衍生物才需要回勾。好吧,在过去几十年中,唯一一家能够在操作系统中包含POSIX前shell的供应商是Sun,甚至他们最终也清理了这一点。是的,最初的问题是以双引号作为条件的
find
命令。感谢您关于backticks的注释,可能是我上次阅读bash手册的这一部分时,它是一些老式版本,就像古代Solaris的版本一样。>_nod,听起来不错——Sun可能是你坚持时间最长的公司,安装了一个原始的Bourne shell,名为
/bin/sh
,并在
/usr/xpg4/bin
或类似的地方安装了一个POSIX sh实例。Fun,Fun.BTW,即使与反勾号或
$()
组合使用,如果文件名有空格,引号仍然是避免字符串拆分的必要条件;例如,
[-f“$(查找“$FULLFN”-键入f-name“$FILENAME”)”]
。behav的额外积分