Answers:
使用“文件”的广义定义
ls | wc -l
(请注意,它不计算隐藏文件,并假定文件名不包含换行符)。
为了包括隐藏文件(.
和除外..
)并避免换行符出现问题,规范的方式是:
find . ! -name . -prune -print | grep -c /
或递归地:
find .//. ! -name . -print | grep -c //
wc
是一个“字数统计”程序。所述-l
开关使其计数行。在这种情况下,它将对来自的输出中的行进行计数ls
。这也是我一直被教如何获取给定目录的文件计数的方法。
ls
确实ls -1
如果输出管道。
ls -la
,您将在目录中得到三行。您要ls -lA | wc -l
跳过.
和..
条目。但是,您仍然会一一掉队。
ls -q | wc -l
-尽管请注意,此方法仍不会对隐藏文件进行计数,并且会对目录进行计数。
对于狭窄的文件定义:
find . -maxdepth 1 -type f | wc -l
-maxdepth 1
用于递归计数文件的(或针对所需的最大搜索深度进行调整)。
find -maxdepth 1 -type f -printf "\n" | wc -l
ls -1 | wc -l
...
$ ls --help | grep -- ' -1'
-1 list one file per line
...
$ wc --help | grep -- ' -l'
-l, --lines print the newline counts
PS:注意ls-<数字一> | wc-<字母-l>
ls
do会-1
自动执行。
[[ -p /dev/stdin ]] && echo "stdin is from a pipe"
使用ls
/ wc
对,最完整的答案可能是
ls -Aq | wc -l
如果您要计算点文件,并且
ls -q | wc -l
除此以外。
-A
是计算点文件,但省略.
和..
。-q
用ls
替换非图形字符,特别是换行符?
,使每个文件输出1行为了从ls
输入端子获得单线输出(即,不将其管道输送到wc
),-1
必须添加选件。
(ls
使用coreutils 8.23进行测试的行为)
-1
是不需要的。至于“它通过控制台输出明智地处理文件名中的换行符”,这是因为-q
开关(您应该使用该开关,而不是-b
因为它是可移植的),该开关“强制每个不可打印的文件名字符和<tab>字符的实例被写入作为<question-mark>('?')字符。如果输出是到终端设备的,则实现默认情况下可以提供此选项。” 因此,例如ls -Aq | wc -l
,计算所有文件/目录或ls -qp | grep -c /
仅计算非隐藏的目录等...
-b
为-q
。
如果您知道当前目录至少包含一个非隐藏文件:
set -- *; echo "$#"
显然,这可以推广到任何glob。
在脚本中,这有时会覆盖位置参数,从而产生不幸的副作用。您可以通过使用子外壳或使用类似以下功能(Bourne / POSIX版本)来解决此问题:
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
另一种解决方案是$(ls -d -- * | wc -l)
。如果是glob *
,则命令可以缩短为$(ls | wc -l)
。解析ls
always 的输出总是让我感到不安,但是在这里,只要您的文件名不包含换行符,或者对ls
它们进行转义,它就应该起作用。并且$(ls -d -- * 2>/dev/null | wc -l)
具有可以很好地处理不匹配的glob的情况的优点(即,在这种情况下,它返回0,而该set *
方法要求精巧地测试glob是否为空)。
如果文件名可能包含换行符,则可以使用$(ls -d ./* | grep -c /)
。
如果有很多匹配文件,则任何依赖传递glob扩展的解决方案都ls
可能因参数列表过长的错误而失败。
local
或将其消除:eval $1=$#
或者只是使用echo $#
do即可number_of_files=$(count_words *)
。
$#
(在编辑之前您没有做过)?
$1
。所以我想算的是不是第一个参数的参数数量。(我不能使用,shift
因为我需要保留变量名。)(嗯,现在您是否要询问第一行...)
shift
如果时间合适,我可以使用。
安装tree命令后,只需键入:
tree
如果您也想要隐藏文件:
tree -a
如果您使用的是Debian / Mint / Ubuntu Linux,请键入以下命令以安装tree命令:
sudo apt-get install tree
选项-L用于指定目录树的最大显示级别。tree命令不仅考虑文件的数量,还计算目录的数量,并根据需要选择任意数量的目录树。
这是吉尔斯(Gills)发表的另一种技巧:
word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(word_count *)
它会创建一个包含13,923个元素的数组(如果那是有多少个文件)。
c
数组的意义是什么?word_count() { echo "$#"; }
足够了。@Gilles解决方案的重点是将计数存储在返回的变量中,以避免必须使用命令替换(这涉及到ksh93以外的shell中的fork和pipe)。
改善以前给出的答案,但是这次明确地做。
$ tree -L 1 | tail -n 1 | cut -d " " -f 3
值得注意的是,使用了一些喜欢的命令,例如tail
和cut
。另外,请注意,默认情况下树不可用。上面的命令首先捕获有关级别1的目录的信息,然后获取tail -n 1
我们目标所在的最后一行,最后得到cut
第三个单词。
例如,位于/
:
/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1
然后,询问目录数又如何呢?
在Linux上,要使命令非常健壮并处理名称中可能包含换行符的文件,请使用以下命令:
find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c
这使我们免于解析输出的麻烦ls
。
有关: