使用 find 从通配符 (*) 中排除

使用 find 从通配符 (*) 中排除

我在 bashscript 中有一个命令,它将从通配符文件夹名称中查找文件,并从该通配符文件夹中对其进行计数,我们有一个要从计数中排除的测试文件夹。

这是我的命令

echo $(date "+%b %_d")
echo "$today"
sr_today=$(find /mnt/data/project_data/web_collab/mailbox/*/sr_pdf/*.pdf -type f -ls | grep "$today" | wc -l)

在邮箱文件夹中有名为
000000
111111
222222
333333
so on...

我想000000从该find命令中排除。那可能吗?有小费吗?

谢谢。

答案1

使用 GNU find

#!/bin/sh

dir='/mnt/data/project_data/web_collab/mailbox/'

sr_today=$(find "$dir" \
             ! -path '*/000000/*' \
             -newermt '12am today' \
             -ipath '*/sr_pdf/*.pdf' |
           wc -l)
  • GNUfind-newermt选项理解与 GNUdate -dtouch -d.查看man find并搜索-newerXY详细信息。

  • 最后的-ipath谓词不区分大小写,因此它将匹配 *.PDF、*.pDf 等。不幸的是,在匹配 sr_pdf 目录时它也不区分大小写。例如,如果存在您不想匹配的 SR_PDF 子目录,并且您确定所有.pdf文件扩展名均为小写,请更改-ipath-path.

    或者,对于区分大小写的sr_pdf路径匹配和不区分大小写的*.pdf文件匹配,将该-ipath行替换为:

      -path '*/sr_pdf/*' \
      -iname '*.pdf' | 

答案2

首先,如果您要使用这样的长路径,最好为其指定自己的变量名称。使代码更易于阅读,确保在各处使用相同的名称而不会出现拼写错误,并且在需要时更容易进行更改。

MAILBOX=/mnt/data/project_data/web_collab/mailbox

如果需要处理的 pdf 文件少于几百个,请尝试此操作:

echo "${MAILBOX}"/*/sr_pdf/*.pdf | grep -v /00000/ | grep "$today" | wc -l

如果您想要一个更通用的解决方案,请执行以下操作:

find "${MAILBOX}" -path '*/sr_pdf/*.pdf' | grep -v /00000/ | grep "$today" | wc -l

相关内容