【问题标题】:Avoid searching (by find command) in to certain directories that match regex patterns避免搜索(通过 find 命令)匹配正则表达式模式的某些目录
【发布时间】:2016-07-14 01:59:32
【问题描述】:

我想知道 bash 中是否有任何工具可以从查找匹配某些正则表达式模式的搜索目录中排除

有一个例子:

  • ./文档
  • ./dokuments/1.txt
  • ./dokuments/files/2.txt
  • ./documentsz/message.doc

例如,当我使用这个正则表达式“ents$”运行我的脚本(基本上是浏览目录并创建关于其内容的报告)时 - 结果应该只是 ./documentsz 中的 message.doc 而不是其他文件。

我见过很多解决方案,如 find 。 -not -name, -regextype posix-egrep -regex,但它对我不起作用,因为我事先不知道正则表达式,我不知道将使用什么目录名称(匹配正则表达式)。

【问题讨论】:

  • 是的,我读过,但它对我不起作用,因为我不知道将使用什么正则表达式。我什至不提前知道排除目录的具体名称
  • 请澄清您的具体问题或添加其他详细信息以准确突出您的需要。
  • 好吧,我需要制作一个应该作为 dirstat 工作的脚本,这意味着我使用两个参数运行脚本:路径和匹配应该被忽略的文件和目录的正则表达式来自搜索。
  • 你的意思是find $1 -type f | grep -v "$2" 之类的吗?

标签: bash find


【解决方案1】:

我不确定你期望你的ctrlv.cz paste 应该输出什么。正则表达式 如下:

在字符串末尾输出不包含enty 的任何内容。

是否要排除以enry 结尾的目录中的所有文件?

find . -type f | grep -v 'enry/'

如果是这种情况,那么您可以单独使用 find :

find . -not \( -path "*enry" -prune \) -o -type f  

如果您想要一个动态正则表达式并希望它匹配每个目录/文件而不是 完整路径,然后您可以使用:(我不建议在生产中使用它 代码)

my_script.sh

#!/usr/bin/env bash
find -type f -print0 | perl -na0 -F/ -e 'print "$_\n" unless grep { /'"$1"'/ } @F'

或使用 AWK:

find -type f | awk -F/ '{for(i=1;i<=NR;i++)if ($i ~ /'"$1"'/) next}1'

用法:

$ bash my_script.sh "enry$"
./dirstat.sh
./dirstat.sh.save
...
./pokus/pokus
./a.out

【讨论】:

  • 正如我在上面所说的,我事先不知道正则表达式,它应该适用于每个正则表达式,因此当用户将其设置为正则表达式“^doku”时,它应该忽略每个文件和目录(以及其中的文件)匹配此正则表达式并打印正在探索的目录中的所有其他内容,当用户将其作为正则表达式'dok'时,它应该以相同的方式工作
  • 它似乎工作了,谢谢你的回答,但我不能使用它,因为便携性会有问题,(而且它有点复杂,至少对我来说)无论如何,知道命令的各个组件做什么会很好
  • 基本上我用斜线分割每一行并尝试匹配每一行的正则表达式
  • 这个肯定更好,如果我可以给你买啤酒,我就去做
  • 但是我还有一个小问题,当我使用你的代码时,它完全可以在我的脚本中运行,但是当我在我的脚本中使用它时,它不会......你不知道吗这怎么可能?查找 $DIR -type f | awk -F/ '{for(k=1;k
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 2016-11-16
  • 2015-08-27
  • 1970-01-01
相关资源
最近更新 更多