问题查找命令Linux

时间:2015-06-11 18:05:56

标签: linux bash find

我有一个文件夹,我想要计算其中的所有常规文件,为此我使用这个bash命令:

find pathfolder -type f  2> err.txt | wc -l

在该文件夹中有3个空文本文件和一个子文件夹,其中包含其他文本文件。 出于这个原因,我应该得到3,但我得到6,我不明白为什么。也许我没有设置一些选项。

如果删除子文件夹,我得到4

2 个答案:

答案 0 :(得分:2)

获取当前目录中没有点文件的所有文件和目录:

shopt -u dotglob
all=(*)

仅抓取目录:

dirs=(*/)

在当前目录中计算仅非点文件

echo $(( ${#all[@]} - ${#dirs[@]} ))

要使用find使用

执行此操作
find . -type f -maxdepth 1 ! -name '.*' -exec printf '%.0s.\n' {} + | wc -l

答案 1 :(得分:1)

以下解决方案会忽略以点开头的文件名。

仅计算pathfolder中的文件:

find pathfolder -maxdepth 1 -type f -not -path '*/\.*' | wc -l

计算pathfolder的所有子目录中的文件:

find pathfolder -mindepth 2 -maxdepth 2 -type f -not -path '*/\.*' | wc -l

更新:将评论转换为答案

根据从anubhava收到的建议,通过使用命令touch $'foo\nbar'创建虚拟文件,wc -l计算此文件名两次,如下所示例如:

$> touch $'foo\nbar'
$> find . -type f
./foo?bar
$> find . -type f | wc -l
2

为了避免这种情况,请在调用wc之前删除换行符(anubhava的solution):

$> find . -type f -exec printf '%.0sbla\n' {} +
bla
$> find . -type f -exec printf '%.0sbla\n' {} + | wc -l
1

或者完全避免调用wc

$> find . -type f -exec sh -c 'i=0; for f; do ((i++)); done; echo $i' sh {} +
1