shell 在find命令中搜索目录范围[关闭]

hiz5n14c  于 12个月前  发布在  Shell
关注(0)|答案(4)|浏览(196)

**已关闭。**此问题为not about programming or software development。目前不接受回答。

此问题似乎与a specific programming problem, a software algorithm, or software tools primarily used by programmers无关。如果您认为此问题与another Stack Exchange site的主题相关,可以发表评论,说明在何处可以回答此问题。
3天前关闭。
Improve this question
我有一个名为test的目录,该目录在日期范围内有子文件夹,如0102,... 31。所有子文件夹都包含.bz2文件。我需要使用查找命令搜索所有具有.bz2扩展名的文件,但不包括特定范围的目录。我知道find . -name ".bz2" -not -path "./01/*",但是如果我想跳过10个目录的话,写-not -path "./01/*"就太可悲了。那么我怎么在我的find命令中跳过01..19子目录呢?

eagi6jfj

eagi6jfj1#

您可以在模式中为选项-not -path使用通配符:

find ./ -type f -name "*.bz2" -not -path "./0*/*" -not -path "./1*/*

字符串
这将排除所有以0或1开头的目录。或者更好:

find ./ -type f -name "*.bz2" -not -path "./[01]*/*"

ma8fv8wu

ma8fv8wu2#

首先,您可以通过使用-prune而不是-not -path来帮助find-这甚至可以避免查看相关目录。
对于你的主要观点-你可以为你的例子构建一个数据库(数字01到19):

find . -path './0[1-9]' -prune -o -path './1[0-9]' -prune -o -print

字符串
如果你也愿意忽略“00”(也许你知道它不存在),那么你可以将合并合并为一个字符串:

find . -path './[01][0-9]' -prune -o -print


如果您的范围不太方便(例如05到25),您可能希望将范围构建到bash变量中,然后将其插入find命令:

a=("-path ./"{05..25}" -prune -o")
find . ${a[*]} -print -prune


(you可能需要echo "${a[*]}"printf '%s\n' ${a[*]}来查看它是如何工作的)

r6l8ljro

r6l8ljro3#

对我来说,我发现find命令作为一个独立的工具有点麻烦。因此,我总是最终使用find的组合来进行递归文件搜索和grep来进行实际的排除/包含。最后我将结果交给第三个命令来执行操作,例如rm来删除文件。
我的通用命令看起来像这样:

find [root-path] | grep (-v)? -E "cond1|cond2|...|condN" | [action-performing-tool]

字符串

  • root-path是开始递归搜索的地方
  • add**-v**选项用于反转匹配结果。
  • cond 1- condN,匹配的条件。当涉及-v时,这是匹配的条件。
  • 动作执行工具完成实际工作

例如,您希望删除当前目录中所有匹配某些条件的文件:

find . -not -name "\." | grep -v -E "cond1|cond2|cond3|...|condN" | xargs rm -rf


正如你所看到的,我们在当前目录中搜索,由点表示为root-path:然后我们想要反转匹配结果,因为我们希望所有文件匹配我们的条件:最后我们将找到的所有文件传递给rm以便删除它们:我在recursive/force delete all files中添加了-rf。我使用find命令和 -not -name“." 来排除当前目录,通常用点表示。
对于实际问题:假设我们有一个使用.git和.metadata目录的目录,我们想在搜索中排除它们:

find . -not -name "\." | grep -v -E ".git|.metadata" | [action-performing-tool]


希望有帮助!

jgovgodb

jgovgodb4#

如果你想排除父目录下的子目录,这可能是有用的:
例如:你有一个父目录“ParentDir”,它有两个子目录“Child1,Child2”。你只想从“Chiled2”读取文件,跳过“Child1”。这样会有帮助。

find ./ParentDir ! -path "./ParentDir/Child1*" -name *.<extention>

字符串

相关问题