我正在尝试使用shell脚本中的find命令模式在目录中查找特定的以下文件。
下面的文件每次都会以下面的格式在目录"/data/output“中创建。
PO_ABCLOAD0626201807383269.txt
PO_DEF 0626201811383639.txt所以我需要找到上面的txt文件,从"PO_ABCLOAD“开始,"PO_DEF”被创建,或者not.if在四个小时内没有创建,然后我需要写日志。
我写了脚本,但我坚持在下面的脚本中找到文件"PO_ABCLOAD“和"PO_DEF格式的文本文件”。
请在这方面提供帮助。
需要在find命令中添加哪些更改。
我的脚本是:
file_path=/data/output
PO_count='find ${file_path}/PO/*.txt -mtime +4 -exec ls -ltr {} + | wc -l'
if [ $PO_count == 0 ]
then
find ${file_path}/PO/*.xml -mtime +4 -exec ls -ltr {} + >
/logs/test/PO_list.txt
fi 提前感谢
发布于 2018-06-27 21:08:01
欢迎来到论坛。要搜索与您正在查找的名称相匹配的文件,可以尝试使用-iname或-name谓词。但是,您的脚本还存在其他问题。
修改次数
首先,我认为find的-mtime测试的工作方式与您预期的不同。
-mtime n
文件的数据上次修改是在n*24小时前。
因此,例如,如果您运行
find . -mtime +4您正在搜索超过四天的文件。要搜索超过四个小时的文件,我认为您需要使用-mmin选项;这将搜索在特定时间前修改过的文件。
命令替换语法
其次,在Bash中使用'进行命令替换将不起作用:您需要使用反引号-如
PO_COUNT=`find ...`而不是
PO_COUNT='find ...'或者-更好的(就像codeforester在评论中指出的那样)-使用$(...) -就像在
PO_COUNT=$(find ...)冗余选项
第三,在这种情况下使用-exec ls -ltr {} +是多余的-因为您要做的就是确定输出中的行数。
因此,脚本中的相关行可能如下所示
PO_COUNT=$(find $FILE_PATH/PO/ -mmin +240 -a -name 'PO_*' | wc -l)或
PO_COUNT=$(find $FILE_PATH/PO/PO_* -mmin +240 | wc -l)如果您想要更紧密地匹配文件名,请尝试(根据codeforester的建议)如下所示
PO_COUNT=$(find $file_path/PO/PO_* -mmin +240 -a \( -name 'PO_DEF*' -o -name 'PO_ABCLOAD*' \) | wc -l)Bash中的备用文件名匹配
最后一件事。如果使用bash,则可以使用大括号扩展来匹配文件名,如
PO_COUNT=$(find $file_path/PO/PO_{ABCLOAD,DEF}* -mmin +240 | wc -l)虽然这稍微更简洁一些,但我不认为它与所有shell都兼容。
https://stackoverflow.com/questions/51062478
复制相似问题