虽然我找不到我想要实现的示例,但我认为这很容易给出看起来具有类似逻辑的示例,例如,如何在使用find
时排除目录?,如何仅在给定目录中查找文件,并使用bash忽略子目录,如何在find中组合2 -name条件?又一次,我被证明是错的:(
我在/data/csvfiles下有许多目录
cd /data/csvFiles/
ls -l
drwxr-x---. dir1
drwxr-x---. dir2
drwxr-x---. dir3
drwxr-x---. dir4
drwxr-x---. dir5
drwxr-x---. dir6
drwxr-x---. dir7
我想找到目录dir2, dir3, dir5, dir7中的所有*.gz文件
您可能猜到,目录的名称与所示的不同。(而且,我的发现比正在讨论的要复杂得多。bash脚本请求开始和结束时间,并通过管道连接到zgrep,并将其传递给用于ssh的服务器名称列表)。我已经包含了一个简单的管道来"排序"来表示这个
从基础开始
find /data/csvFiles/ -type f -name "*.gz" | sort
阅读链接讨论,我的第一个尝试是
find /data/csvFiles/ -type d ( -path ./dir2 -o -path ./dir3 -o -path ./dir4 ) -type f -name "*.gz" | sort
不返回任何东西,我认为这是由于使用了。/然后,在尝试列表之前,我小心地回溯到单个目录。希望*dir*
的使用将使它'相对'到/data/csvFiles.
find /data/csvFiles/ -path '*dir2*' -type f -name "*.gz" | sort
这可以工作,但请注意,我已经从-type d到路径(阅读不同问题的答案)。
然后我尝试将工作(使用-path)示例与使用列表
的答案中提供的格式结合起来。find /data/csvFiles/ -type d ( -path '*dir2*' ) -type f -name "*.gz" | sort
同样,没有返回任何内容,尽管我知道文件名*.gz存在于/data/csvFiles/dir2中。
我已经尝试了很多组合,如果有人能解释如何添加子目录列表,我将不胜感激,我猜是类似
的东西find /data/csvFiles/ -type d ( -path '*dir2*' -o -path '*dir2*' -o -path '*dir3*' -o -path '*dir5*' -o '-path *dir7*' ) -type f -name "*.gz" | sort
虽然我不确定为什么type -d似乎不能与-path一起工作,但我猜社区认为我的问题不值得回应,因为答案相当简单。离开链接的讨论,我突然想到我只需要-path 'test'。
find /data/csvFiles/ ( -path '*dir2*' -o -path '*dir2*' -o -path '*dir3*' -o -path '*dir5*' -o '-path *dir7*' ) -type f -name "*.gz" | sort
我相信以上方法有效……(虽然我实际上有/data/csvFiles/tmp/dir2,这把事情搞砸了。理想情况下,我只想测试起始点之后的第一个目录级别,但是-depth似乎有冲突。然而,这是另一个问题。注:我知道-prune,但我想知道是否可以按深度进行测试。
编辑我又错了,-maxdepth确实有效。我认为它应该是相对于开始位置的,它是,但它看起来开始位置是1,并且上一级是1+1。
find /data/csvFiles/ -maxdepth 2 ( -path '*dir2*' -o -path '*dir2*' -o -path '*dir3*' -o -path '*dir5*' -o '-path *dir7*' ) -type f -name "*.gz" | sort
以上就是我一直在寻找的解决方案。