bash:从给定子目录名称的当前目录获取路径
问题描述:
尝试编写脚本以在资源被删除后清理环境文件。问题是所有的脚本是作为输入给出的是资源的名称(这是不能改变的),除此之外还有零识别信息。 如何找到资源所在目录的路径?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。
答
执行此类任务的标准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
之前非常谨慎!
是不是'发现。 -name'eee_blue'',可能使用'-exec rm -fr {} +'打印名字,或者类似的东西?基本原理似乎是'使用'find'命令'。你没有意识到这一点,或者有没有理由不使用它? –
@JonathanLeffler Bash noob,没有想法存在。这很棒!随意回答,所以我可以接受,看起来像我的答案 – Alex