如何在Shell脚本的目录中查找特定文件?

时间:2018-06-27 12:10:05

标签: shell unix

我正在尝试使用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 

预先感谢

1 个答案:

答案 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)

Bash中备用文件名匹配

最后一件事... 如果使用PO_COUNT=$(find $file_path/PO/PO_* -mmin +240 -a \( -name 'PO_DEF*' -o -name 'PO_ABCLOAD*' \) | wc -l) ,则可以使用括号扩展来匹配文件名,如

bash

虽然这稍微简洁一些,但我认为它与所有shell都不兼容。