【问题标题】:Get file path with find without giving filename使用查找获取文件路径而不提供文件名
【发布时间】:2012-11-30 21:10:45
【问题描述】:

如何获取目录中的 .pid 文件的路径。 下面的代码只返回文件

root@linux [/]# ls -l $(find /* -name dovecot | grep var/run) | grep pid
-rw-------  1 root root       5 Nov 28 15:22 master.pid

【问题讨论】:

    标签: bash find command


    【解决方案1】:

    猜猜这就是你要找的东西:

    find /var/run -name "*.pid" 2>/dev/null | grep dovecot | xargs ls -l
    

    当您在过滤器表达式中指定(部分)路径时,您还可以在 grep 命令中缩小匹配范围。

    【讨论】:

    • 之前找到的文件名是master.pid在目录dovecot中,var/run在某处的路径中。
    • 啊,好吧,搞错了。我改变了建议。那样更好?
    • 更好。可能是/var/run,但原始搜索位于/* 下的所有(非隐藏)目录下,例如会找到/usr/adm/var/run/dovcote
    • 好的,你可以搜索整个文件系统。只需缩短 find 命令中的路径即可。但你不想那样做,是吗?这将花费很长时间并产生巨大的磁盘负载......
    • 我不想搜索整个系统——但 OP 做到了。指出这是一个可能非常昂贵的搜索是非常合理的(避免搜索/.* 文件几乎不值得输入*)...
    【解决方案2】:

    我想输出的解释一定是find命令找到了一个目录名如:

    /var/run/dovecot
    

    然后你在目录上执行ls -l,它列出了目录中的文件,没有任何通往它的路径。您需要找到一种可靠的方法来列出目录中的文件及其完整路径名。

    一种方法(我认为不是好方法)是:

    find $(find /* -name dovecot -type d | grep var/run) -type f -name '*.pid' \
         -exec ls -l {} +
    

    这将使用您的第一个find 命令来获取您感兴趣的目录,然后再次运行find 以查找.pid 文件并在它们上执行ls -l+ 表示法意味着find 的行为有点像xargs,将大量文件名组合成一个ls -l

    【讨论】:

      【解决方案3】:
      cat /var/run/dovecot/master.pid
      

      ?

      或者:

      # readlink -f /var/run/dovecot/*.pid
      /var/run/dovecot/master.pid
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-29
        • 2013-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多