cod*_*boy 12 command-line filesystems ubuntu
如果我这样做ls -1 target_dir | wc -l
,我会得到一个目录中的文件数。我觉得这有点麻烦。有没有更优雅或更简洁的方式?
Chr*_*own 12
假设 bash 4+(任何受支持的 Ubuntu 版本都有):
num_files() (
shopt -s nullglob
cd -P -- "${1-.}" || return
set -- *
echo "$#"
)
Run Code Online (Sandbox Code Playgroud)
将其称为num_files [dir]
. dir
是可选的,否则使用当前目录。您的原始版本不计算隐藏文件,因此也不计算隐藏文件。如果你想要那个,shopt -s dotglob
在set -- *
.
您的原始示例不仅计算常规文件,还计算目录和其他设备——如果您真的只需要常规文件(包括常规文件的符号链接),则需要检查它们:
num_files() (
local count=0
shopt -s nullglob
cd -P -- "${1-.}" || return
for file in *; do
[[ -f $file ]] && let count++
done
echo "$count"
)
Run Code Online (Sandbox Code Playgroud)
如果你有 GNU find,类似这样的东西也是一个选项(注意这包括隐藏文件,你的原始命令没有这样做):
num_files() {
find "${1-.}" -maxdepth 1 -type f -printf x | wc -c
}
Run Code Online (Sandbox Code Playgroud)
(如果您还想计算到常规文件的符号链接,请更改-type
为-xtype
)。
ls
仅当直接输出到终端时才是多列,可以删除“-1”选项,可以删除wc
“-l”选项,只读取第一个值(懒惰的解决方案,不用于法律证据,刑事调查、关键任务、战术行动..)。
ls target | wc
Run Code Online (Sandbox Code Playgroud)