【问题标题】:BASH - counting the number of executable filesBASH - 计算可执行文件的数量
【发布时间】:2012-01-19 20:26:16
【问题描述】:

我试图在一个文件夹中找到可执行文件及其总数,它显示但总数不是我下面的代码,如果我犯了错误,有人可以帮助我吗,我只是一个试图学习的新手bash 脚本,希望这是正确的方法,谢谢

#!/bin/bash
To="home/magie/d2"
cd "$To"
find . -type f -perm 755

if 
   find . -type f -perm 755
then
 echo | echo wc -l
fi

【问题讨论】:

    标签: linux bash shell unix scripting


    【解决方案1】:

    如果您想查找所有可执行文件,请使用以下命令:

    find home/magie/d2 -type f -perm -u+rx | wc -l
    

    find home/magie/d2 -type f -perm +111 | wc -l
    

    这里的所有答案都是查找权限为 755 的文件,但请记住,即使 744 或 700 也是用户的可执行文件。

    【讨论】:

    • 另见-executable 测试。
    • @DennisWilliamson:在我的Mac OS X 10.6.8 上找到没有-executable 选项。
    • 我应该提到它是 GNU 特定的。
    • @DennisWilliamson 是的,没错。几天前我才知道-executable 选项。但是,由于它不是普遍可用的,所以我没有在我的答案中使用它。
    【解决方案2】:

    只需删除if 结构和echo

    #!/bin/bash
    To="home/magie/d2"
    cd "$To"
    find . -type f -perm 755
    
    find . -type f -perm 755 | wc -l
    

    【讨论】:

      【解决方案3】:

      使用 /111 查找设置了任何执行位的任何文件。

      找到 . -type f -perm /111 | wc -l

      【讨论】:

        【解决方案4】:

        我想我会这样做:

        #!/bin/bash
        dir=$1
        files="$(find $dir -perm 755)"
        total=$(wc -l <<< "$files")
        echo "$files"
        echo "Total: $total"
        

        必须在命令行中将所需目录作为参数传递,并且引号用于保留wc 稍后需要的换行符以正确计算行数。

        【讨论】:

        • 我想说我们可以使用字符串 heredoc : total=$(wc -l &lt;&lt;&lt;"$files") 但现在不确定是否更好。 :)
        • @JaypalSingh 我认为这里的字符串不常用,但我觉得它们很好。感谢您的建议。
        • 不客气 :)。我在 3-4 个月前开始学习 bash,第一个月我只是在阅读 SO 上发布的答案以了解良好实践。我从阅读答案中了解到pipesbad,因此我养成了使用heredoc 语法或command sub 的习惯。我仍然不能完全确定每种情况下幕后究竟发生了什么。所以看起来像 back2books。 :)
        • @JaypalSingh:管道还不错。你是从哪里得到这个想法的?
        • @DennisWilliamson 通过查看 SO 上发布的答案。我收集到的缺点是它创建了一个新的子 shell,它创建了一个新的进程。
        【解决方案5】:

        从命令行一个简单的单行应该可以解决问题 -

        wc -l < <(find /home/magie/d2 -type f -perm 755)
        

        &lt;(..)process substitution

        【讨论】:

        • 为什么不是简单的管道? find . -type f -perm 755 | wc -l
        • 这不是意味着 3 个进程(1xfind、1xpipe、1xwc)而不是使用命令 sub 的 2 个进程吗?
        • 命令替换创建一个命名管道。试试grep -l . &lt;(echo foo)
        • 嗯.. 谢谢@DennisWilliamson。因此,在管道上使用命令 sub 没有任何好处(我的意思是在这种情况下)。我们仍然会在同一个 shell 中完成所有这些工作,而不是 fork 一个新的,或者我的理解是错误的吗? (对不起,我还在学习)并感谢您的反馈。
        • 其实&lt;()叫做进程替换。命令替换为$()。管道(本身)和进程替换不会创建子shell,命令替换会。例如,进入while 循环的管道会创建子shell(这就是为什么你应该使用done &lt; &lt;(foo) 而不是foo | while
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-02
        • 2018-01-28
        • 2023-03-07
        • 2014-02-28
        • 1970-01-01
        • 1970-01-01
        • 2011-11-05
        相关资源
        最近更新 更多