BASH - 统计可执行文件的数量

4

我正在尝试查找文件夹中可执行文件及其总数,它显示了文件但没有显示总数。下面是我的代码,请问有谁能帮我找出错误?我是一个新手,希望通过学习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
5个回答

3
如果你想找到所有可执行文件,可以使用以下命令:
find home/magie/d2 -type f -perm -u+rx | wc -l

或者

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

这里的所有答案都仅查找具有755权限的文件,但请记住,用户还可以执行具有744或700权限的文件。


2
另请参阅“-executable”测试。 - Dennis Williamson
@DennisWilliamson: 在我的 Mac OS X 10.6.8 中,find 命令没有 -executable 选项。 - anubhava
我应该提到这是GNU特定的。 - Dennis Williamson
@DennisWilliamson 是的,没错。我几天前才了解到-executable选项。但由于它并不普遍可用,所以我在这里的答案中没有使用它。 - anubhava

2

使用/111可以查找任何一个拥有任何执行位的文件。

在当前目录下查找所有类型为文件且权限含有/111的文件,然后统计它们的数量。


2
只需删除if结构和echo即可。
#!/bin/bash
To="home/magie/d2"
cd "$To"
find . -type f -perm 755

find . -type f -perm 755 | wc -l

2
我认为我会这样做:

我认为我会这样做:

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

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


我想说我们可以使用字符串heredoc:total=$(wc -l <<<"$files"),但现在不确定这是否更好。 :) - jaypal singh
@JaypalSingh 我认为这里的字符串并不常用,但我觉得它们很好。感谢您的建议。 - jcollado
不客气 :)。我3-4个月前开始学习bash,最开始的一个月里我只是阅读 SO 上发布的答案来了解好的实践方法。通过阅读这些答案,我理解到“管道”是不好的,因此我养成了使用heredoc语法或命令替换的习惯。我仍然不完全确定每种情况背后究竟发生了什么。看起来需要重新回到书本中去学习了。 :) - jaypal singh
@JaypalSingh:管道并不差。你从哪里得到这个想法的? - Dennis Williamson
从查看SO上发布的答案中,我得出的缺点是它会创建一个新的子shell,它会fork一个新进程。 - jaypal singh
那并不是“坏”的。通常,这是必要的。 - Dennis Williamson

1

从命令行来看,一个简单的一行代码就可以解决问题 -

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

<(..)进程替换


2
为什么不使用简单的管道呢?find . -type f -perm 755 | wc -l - Dennis Williamson
这难道不意味着要使用3个进程(1xfind,1xpipe,1xwc),而不是使用命令子串只用2个进程吗? - jaypal singh
1
命令替换会创建一个命名管道。尝试运行 grep -l . <(echo foo) - Dennis Williamson
嗯...谢谢@DennisWilliamson。那么在这种情况下,使用命令替换而不是管道没有任何好处。我们仍然会在同一个shell中执行所有操作,而不是分叉出一个新的进程,我的理解是否正确?(抱歉我还在学习),感谢您的反馈。 - jaypal singh
3
实际上,<() 被称为进程替换,而命令替换是 $()。管道(本身)和进程替换不会创建子Shell,但命令替换会创建。将管道输入 while 循环中会创建子Shell(这就是为什么应该使用 done < <(foo) 而不是 foo | while 的原因)。 - Dennis Williamson
真的是我的错..我刚刚发布了一个关于命令子集的答案,结果就卡在了我的脑海里。 - jaypal singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接