【问题标题】:Find folder of specific file查找特定文件的文件夹
【发布时间】:2018-04-29 03:19:54
【问题描述】:

我正在尝试查找特定文件的文件夹位置,例如libgfortran.so

到目前为止我尝试过的是:

find 2>/dev/null / -name libgfortran.so

... 这将输出如下内容到stdout(将stderr 重定向到/dev/null):

/usr/lib/gcc/x86_64-linux-gnu/4.8/libgfortran.so

我想从中只提取文件夹(没有尾随 /):

/usr/lib/gcc/x86_64-linux-gnu/4.8

我已经尝试过类似的东西:

find 2>/dev/null / -name libgfortran.so | sed 's/\(\/.*\/\)/\1/'

...我希望能够捕获第一个和最后一个 / 之间的内容(然后我需要删除最后一个 /),但我得到的输出仍然是:

/usr/lib/gcc/x86_64-linux-gnu/4.8/libgfortran.so

如何实现我想要的?

【问题讨论】:

  • @Androbin 这给出了sed: -e expression #1, char 12: invalid reference \1 on s' 命令的 RHS`
  • 对不起,我的意思是 sed 's|(.*)/|\1|g'
  • @Androbin 也产生了完全相同的错误
  • 恐怕,所以去掉了我的反斜杠。
  • 将它们放在左括号和右括号之前。

标签: regex unix sed find


【解决方案1】:

类似:

dirname `find 2>/dev/null / -name libgfortran.so`

应该可以。

【讨论】:

    【解决方案2】:

    您可以使用 grep 以更简单的方式实现此目的:

    find 2>/dev/null / -name libgfortran.so | grep -o '\/.*\/'  
    

    【讨论】:

    • 关闭,但这会留下一个尾随 / :)
    • 啊,抱歉,我认为这无关紧要。然后,查看我的第二个解决方案(我刚刚编辑过的),或者@user3100381 的解决方案,实际上这是更好的解决方案
    【解决方案3】:

    如果你真的想用sed

    find 2>/dev/null / -name libgfortran.so | sed -E 's#(/.*)/(.*)#\1#g'
    

    -E 告诉 sed 使用正则表达式,因此您不必转义括号。 \1 组是您的路径,\2 是文件名。

    【讨论】:

      【解决方案4】:
      find / -name libgfortran.so -exec dirname {} \; 2> /dev/null
      

      【讨论】:

      • 谢谢。出于兴趣,您的回答与@JeanBaptiste 的回答有什么真正的区别?
      • 这一项需要考虑多个参数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      • 2014-03-13
      相关资源
      最近更新 更多