首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在shell脚本中查找目录中的特定文件?

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

Stack Overflow用户
提问于 2018-06-27 20:10:05
回答 1查看 155关注 0票数 2

我正在尝试使用shell脚本中的find命令模式在目录中查找特定的以下文件。

下面的文件每次都会以下面的格式在目录"/data/output“中创建。

代码语言:javascript
运行
复制
 PO_ABCLOAD0626201807383269.txt
 PO_DEF 0626201811383639.txt

所以我需要找到上面的txt文件,从"PO_ABCLOAD“开始,"PO_DEF”被创建,或者not.if在四个小时内没有创建,然后我需要写日志。

我写了脚本,但我坚持在下面的脚本中找到文件"PO_ABCLOAD“和"PO_DEF格式的文本文件”。

请在这方面提供帮助。

需要在find命令中添加哪些更改。

我的脚本是:

代码语言:javascript
运行
复制
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 

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2018-06-27 21:08:01

欢迎来到论坛。要搜索与您正在查找的名称相匹配的文件,可以尝试使用-iname-name谓词。但是,您的脚本还存在其他问题。

修改次数

首先,我认为find-mtime测试的工作方式与您预期的不同。

-mtime n

文件的数据上次修改是在n*24小时前。

因此,例如,如果您运行

代码语言:javascript
运行
复制
find . -mtime +4

您正在搜索超过四天的文件。要搜索超过四个小时的文件,我认为您需要使用-mmin选项;这将搜索在特定时间前修改过的文件。

命令替换语法

其次,在Bash中使用'进行命令替换将不起作用:您需要使用反引号-如

代码语言:javascript
运行
复制
PO_COUNT=`find ...`

而不是

代码语言:javascript
运行
复制
PO_COUNT='find ...'

或者-更好的(就像codeforester在评论中指出的那样)-使用$(...) -就像在

代码语言:javascript
运行
复制
PO_COUNT=$(find ...)

冗余选项

第三,在这种情况下使用-exec ls -ltr {} +是多余的-因为您要做的就是确定输出中的行数。

因此,脚本中的相关行可能如下所示

代码语言:javascript
运行
复制
PO_COUNT=$(find $FILE_PATH/PO/ -mmin +240 -a -name 'PO_*' | wc -l)

代码语言:javascript
运行
复制
PO_COUNT=$(find $FILE_PATH/PO/PO_* -mmin +240 | wc -l)

如果您想要更紧密地匹配文件名,请尝试(根据codeforester的建议)如下所示

代码语言:javascript
运行
复制
PO_COUNT=$(find $file_path/PO/PO_* -mmin +240 -a \( -name 'PO_DEF*' -o -name 'PO_ABCLOAD*' \) | wc -l)

Bash中的备用文件名匹配

最后一件事。如果使用bash,则可以使用大括号扩展来匹配文件名,如

代码语言:javascript
运行
复制
PO_COUNT=$(find $file_path/PO/PO_{ABCLOAD,DEF}* -mmin +240 | wc -l)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51062478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档