【问题标题】:How to find the particular files in a directory in a shell script?如何在 shell 脚本的目录中查找特定文件?
【发布时间】:2018-06-27 12:10:05
【问题描述】:

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

提前致谢

【问题讨论】:

    标签: shell unix


    【解决方案1】:

    欢迎来到论坛。要搜索与您正在查找的名称匹配的文件,您可以尝试使用 -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。

    【讨论】:

    • 使用$() 代替反引号是一种很好的做法。见Backticks vs braces in Bash
    • @codeforester:感谢您的建议。我刚刚更新了我的答案。
    • \( -iname 'PO_DEF' -o -iname 'PO_ABCLOAD*' \) 更安全。
    • @codeforester:是的,我也打算这样做。可能会更新我的答案 - 尽管我想知道它是否已经足够长了。
    • 在 AIX 中我收到错误 -iname is not a valid option.
    猜你喜欢
    • 2014-11-18
    • 2021-12-14
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 2020-06-28
    • 2011-07-06
    相关资源
    最近更新 更多