2017-06-05 127 views
0

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

该目录设置有点像下面,虽然更广泛。所有这些都是目录,而不是文件。可以有多达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_green或只是ddd

作为一个例子,给定eee_blue作为输入,我需要知道eee_blue的路径从工作目录,所以我可以在那里cd和删除目录。 IE,我预计会返回bar/eee/eee_blue/bar/eee/,要么是可以接受的。

我目前可以看到的“最佳”选项是通过多个greps将每个目录的cd放入最低级别,获取每个目录并查找匹配,以及何时(最终)匹配将cd保存为cd路径。这坦率地听起来很糟糕,效率低下。

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

这个脚本需要在上运行mac和linux,尽管在绝望中我只能去linux。

+1

是不是'发现。 -name'eee_blue'',可能使用'-exec rm -fr {} +'打印名字,或者类似的东西?基本原理似乎是'使用'find'命令'。你没有意识到这一点,或者有没有理由不使用它? –

+0

@JonathanLeffler Bash noob,没有想法存在。这很棒!随意回答,所以我可以接受,看起来像我的答案 – Alex

回答

1

执行此类任务的标准Unix工具是find命令。 GNU版本的find拥有比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之前非常谨慎!

相关问题