是否有更简洁的替代管道到 wc 来计算目录中的文件

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 dotglobset -- *.

您的原始示例不仅计算常规文件,还计算目录和其他设备——如果您真的只需要常规文件(包括常规文件的符号链接),则需要检查它们:

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)。

  • @MichaelMartinez 编写明显的代码并不能替代编写正确的代码。 (4认同)

Emm*_*uel 2

ls仅当直接输出到终端时才是多列,可以删除“-1”选项,可以删除wc“-l”选项,只读取第一个值(懒惰的解决方案,不用于法律证据,刑事调查、关键任务、战术行动..)。

ls target | wc 
Run Code Online (Sandbox Code Playgroud)

  • 对于包含换行符的文件名,此操作会失败。 (5认同)