bash:从给定子目录名

时间:2017-06-05 14:29:33

标签: linux bash macos

尝试编写脚本以在删除资源后清理环境文件。问题是所有脚本都是作为输入给出的资源的名称(这不能更改),除此之外的零识别信息。 如何找到资源所在目录的路径?

目录的设置有点像下面这样,虽然要广泛得多。所有这些都是目录,而不是文件。可以有多达40多个目录可供搜索,但所需的目录通常不超过2-3个目录。

foo
    aaa
       aaa_green
       aaa_blue
    bbb
    ccc
       ccc_green
bar
    ddd
    eee
       eee_green
       eee_blue
    fff
       fff_green
       fff_blue
       fff_pink

我可能会像aaa_greenddd那样提交输入。

作为一个例子,给定eee_blue作为输入,我需要知道工作目录中的eee_blue路径,这样我就可以在那里删除并删除目录。 IE,我希望返回bar/eee/eee_blue/bar/eee/,两者都可以接受。

我目前可以看到的“最佳”选项是通过多个greps进入每个目录的最低级别,获取每个内容并查找匹配,并且当它(最终)匹配时保存该cd'ing为路径。坦白说,这听起来很糟糕,效率很低。

我能想到的唯一另一种替代方法是直接递归grep,但我测试了它,并且在8分钟它仍然没有完成运行。

这个脚本需要在 mac和linux 上运行,尽管在绝望的压力下我只能使用linux。

1 个答案:

答案 0 :(得分:1)

执行此类任务的标准Unix工具是find命令。 find的GNU版本具有比POSIX规范更广泛的选项(相当大的余地)。 macOS Sierra(和Mac OS X)上的版本与GNU版本类似。我在Apple find找到了OS X 10.9的在线手册,但在某个地方可能有更好的位置。

看起来您可能想要运行:

find . -name 'eee_blue'

将打印匹配文件或目录的名称,或者可能:

find . -name 'eee_blue' -exec rm -fr {} +

将在每个名称上运行rm -fr命令。如果您愿意,可以运行您创建的自定义脚本代替rm -fr;如果逻辑很复杂,那就是我的工作。

在自动使用rm -fr之前,请 极其 谨慎!