我正在尝试使用Shell脚本中的find命令模式在目录中查找下面的特定文件。
以下文件将每次以以下格式在目录“ / data / output”中创建。
PO_ABCLOAD0626201807383269.txt
PO_DEF 0626201811383639.txt
因此,我需要找到上述从“ PO_ABCLOAD”开始的txt文件,并且是否创建了“ PO_DEF”。如果四个小时都没有创建,则需要在日志中进行记录。
我编写了脚本,但是在下面的脚本中一直找不到文件“ 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
预先感谢
答案 0 :(得分:2)
欢迎来到论坛。要搜索与您要查找的名称匹配的文件,可以尝试使用-iname
或-name
谓词。但是,您的脚本还有其他问题。
首先,我认为find
的{{1}}测试的工作方式与您预期的不同。从手册中:
-mtime n
文件数据的最后修改时间为n * 24小时。
例如,如果您运行
-mtime
您要搜索的文件已存在超过四天。要搜索超过四个小时个文件的文件,我认为您需要使用find . -mtime +4
选项;这将搜索在分钟之前被修改过的文件。
第二,在Bash中使用-mmin
进行命令替换将不起作用:您需要改用反引号-如
'
代替
PO_COUNT=`find ...`
或者-更好(如codeforester在评论中指出)-使用PO_COUNT='find ...'
-如
$(...)
第三,在这种情况下,使用PO_COUNT=$(find ...)
是多余的-因为您要做的只是确定输出中的行数。
因此脚本中的相关行可能会变成类似
-exec ls -ltr {} +
或
PO_COUNT=$(find $FILE_PATH/PO/ -mmin +240 -a -name 'PO_*' | wc -l)
如果您想更紧密地匹配文件名,请尝试(按照codeforester的建议)
PO_COUNT=$(find $FILE_PATH/PO/PO_* -mmin +240 | wc -l)
最后一件事...
如果使用PO_COUNT=$(find $file_path/PO/PO_* -mmin +240 -a \( -name 'PO_DEF*' -o -name 'PO_ABCLOAD*' \) | wc -l)
,则可以使用括号扩展来匹配文件名,如
bash
虽然这稍微简洁一些,但我认为它与所有shell都不兼容。