删除“总“来自 ls -l 输出的行?

删除“总“来自 ls -l 输出的行?

我通过 Google/ 找到的最好的信息man ls是:

ls -l | grep -v '^total'

我在标志中遗漏了什么东西吗ls

另外,为什么无论 -h 标志如何,总大小都是以 kb 为单位?划掉它,看起来是这样,不确定我当时看到了什么。

答案1

查看源代码coreutils,我发现在使用选项total时始终会显示-l目录

使用-d选项列出条目而不是目录内容会隐藏total。但是,如果您在不带参数的情况下(或在目录上)运行该命令,它只会显示目录而不显示其内容。因此,您需要通配符。*匹配所有文件并.*匹配隐藏文件(与选项相对应-a):

ls -ld * .*

至于-h选项,对我来说是有用的。1118360 字节显示为 1.1M。小于 1024 的文件以字节为单位显示。

答案2

使用通配符来避免ls运行目录列表并不是最理想的,因为它会阻止您使用ls诸如 之类的选项--almost-all

喜欢Enzotib 的建议,删除它的最简单方法是将其通过管道传输tail以截掉第一行。但是,ls将检测到它的输出是管道而不是交互式的,并以不想要的方式更改其默认值。因此,为了使其健壮,您还应该添加一些选项:

  • --color=always:继续显示颜色
  • --hide-control-chars:打印?文件名代替控制字符,这可能会弄乱控制台输出

我有一个脚本~/bin/l(您也可以使用 Bash 别名~/.bash_aliases):

#!/bin/bash
ls -l --color=always --hide-control-chars "$@" | tail --lines=+2

您还可以ls默认添加任何其他想要的选项,例如--group-directories-first --time-style='+%FT%T.%N%:::z' --indicator-style=slash

答案3

ls -l *

将为您提供不带 的“正常命名”文件夹内容total。这可能适合您的需求。不幸的是,它不会为您提供dot带前缀的文件。如果您使用,ls -l * .*您将会陷入混乱,因为 linux 会向上导航树。

请注意,点前缀可能表示文件夹,或者使用通配符表示上面的文件夹,因此它无法帮助您选择以点为前缀的常规文件。这似乎是一个不幸的设计决定。

答案4

回答您的确切问题是,ls -1A .它显示文件、目录和隐藏文件/目录,不使用任何管道或外部工具(grep/tr/cut..),并且不依赖于打开或关闭任何 shell 通配符选项(例如 extglob、globstar 或 nullglob)。我已经对其进行了测试以验证该语句。

-1    list one file per line.  Avoid '\n' with -q or -b
-A,   --almost-all           do not list implied . and ..

示例输出:

user@host:/dir$ ls -1A .
temp
terraform
.test
tor
torrent-stuff
.Trash-1000
virtual_appliance
visualblind
vpn-ipv4.txt
vpn-ipv6.txt
zztestfile
.zztestfile2

附注一下,下面是我在 .bash_aliases 中保存的与列出目录/文件相关的内容:

# ls directories
alias lsd2='ls -d */'
alias lsd3='ls -p . | grep -E "/$" | tr -d "/"'
alias lsd4='ls -lA | grep -E "^d"'
alias lsd5='ls -pv . | grep -E "/$" | tr -d "/"'
alias lsd='ls -lAd */'
# ls files
alias lsf='ls -pA | grep -vE "/$"'
alias lsf2='ls -p | grep -v "/"'
alias lsf3='ls -p . | grep "/" | tr -d "/"'
alias lsf4='ls -lA | grep -vE "^d"'
# ls normal
alias lsnormal='ls -lAh1d *'
alias lsnormal2='ls -1 .'

相关内容