我有一个文件夹,我想要计算其中的所有常规文件,为此我使用这个bash命令:
find pathfolder -type f 2> err.txt | wc -l
在该文件夹中有3个空文本文件和一个子文件夹,其中包含其他文本文件。 出于这个原因,我应该得到3,但我得到6,我不明白为什么。也许我没有设置一些选项。
如果删除子文件夹,我得到4
答案 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