从“ls -al”命令的输出中删除硬链接数量

从“ls -al”命令的输出中删除硬链接数量

这是ls -al命令的输出:

total 280K
drwxrwxr-x 2 enan enan 4.0K Jun 28 09:59 ranger/
drwxrwxr-x 2 enan enan 4.0K Jun  8 23:26 scripts/
-rw-rw-r-- 1 enan enan   49 Jun  4 18:19 caps_to_ctrl.sh
-rw-rw-r-- 1 enan enan  739 Jun  4 18:19 cmus.theme
-rw-rw-r-- 1 enan enan 8.6K Jun  4 18:19 compton.conf
-rw-rw-r-- 1 enan enan 5.9K Jun 22 09:39 config
-rw-rw-r-- 1 enan enan  859 Jun 14 12:13 i3blocks.conf
-rw-rw-r-- 1 enan enan 4.7K Jun 14 12:13 init.el
-rw-rw-r-- 1 enan enan 8.7K Jun 28 11:22 init.vim
-rw-rw-r-- 1 enan enan  815 Jun 14 12:13 install.sh
-rwxrwxr-x 1 enan enan  142 Jun  4 18:19 lock.sh*
-rw-rw-r-- 1 enan enan 1.1K Jun 21 13:30 README.md
-rw-rw-r-- 1 enan enan 197K Jun 14 12:13 screenshot.png
-rw-rw-r-- 1 enan enan 1.2K Jun 20 21:51 Session.vim
-rw-rw-r-- 1 enan enan  427 Jun  9 13:46 tmux.sh

-rw-rw-r--可以看到文件权限和文件所有者之间有一个数字enan。该数字是文件的硬链接数。在输出中显示这一点对于某些情况可能有用,但现在我不需要它,有时它会分散我的注意力。您可以看到,我有办法从输出中删除最后修改日期,ls -al因为我现在不需要它。

那么,如何从ls -al命令的输出中删除硬链接的数量呢?在命令的输出中显示硬链接的数量和上次修改日期的重要性是什么?我的意思是,如果你们中有人使用这些信息,请告诉我为什么以及如何这样做,因为我不想无意中掩盖我应该使用的行为。

答案1

如果您不想看到第二列中的链接,则可以通过管道ls -alawk其删除:

ls -al | awk '{$2=""; print $0}'

这将使用标准分隔符(在本例中为空格)打印除第二列之外的所有列。

在我的环境中,上次修改日期的列是 6、7 和 8,使用空格作为分隔符,以便删除它们和第二列:

ls -la | awk '{$2=$6=$7=$8=""; print $0}'

如果您不需要或不想查看某些列,那么您可以使用上面的语法作为模型来删除您想要的任何列。它不会伤害任何东西。如果您只想查看所有列以免错过任何内容,请使用标准:

ls -al

如果您想要别名,请将以下内容添加到 ~/.bashrc:

la() {
    ls -la | awk '{$2=$6=$7=$8=""; print $0}'
}

该函数的行为方式相同,无需考虑和转义单引号和双引号。我使用laasll给出了语法错误,因为它已经是我的环境中的别名。

答案2

要从 的输出中删除硬链接计数,ls -l同时仍保持该行的其余部分完好无损:

ls -l | sed -E '2,$s/ +[0-9]+//'

替换sed将删除第一行之后每行的第一组数字及其前面的任何空格(第一行包含total)。

作为一个函数

myls () {
    command ls -l "$@" | sed -E '2,$s/ +[0-9]+//'
}

在通过 发送结果之前,该函数会调用ls -l用户向该函数提供的任何其他命令行参数sed

通过使用command ls,我们可以确保,如果您稍后决定将函数重命名为ls,该函数不会递归地调用自身。

例子:

$ ls -la ~/.skel
total 18
drwxr-xr-x  2 kk    wheel  512 May  4 16:29 .
drwxr-xr-x  3 kk    wheel  512 Jun 28 08:15 ..
-rw-r--r--  1 kk    wheel   87 Nov  1  2017 .Xdefaults
-rw-r--r--  1 kk    wheel  771 Feb  9 10:18 .cshrc
-rw-r--r--  1 kk    wheel  101 Nov  1  2017 .cvsrc
-rw-r--r--  1 kk    wheel  359 Nov  1  2017 .login
-rw-r--r--  1 kk    wheel  175 Nov  1  2017 .mailrc
-rw-r--r--  1 kk    wheel  229 May  4 16:29 .profile
-rw-r--r--  1 kk    wheel  108 Apr 15 12:50 .vimrc
-rw-r--r--  1 kk    wheel    0 Apr 21 17:44 .zshrc

$ myls -a ~/.skel
total
drwxr-xr-x  kk    wheel  512 May  4 16:29 .
drwxr-xr-x  kk    wheel  512 Jun 28 08:15 ..
-rw-r--r--  kk    wheel   87 Nov  1  2017 .Xdefaults
-rw-r--r--  kk    wheel  771 Feb  9 10:18 .cshrc
-rw-r--r--  kk    wheel  101 Nov  1  2017 .cvsrc
-rw-r--r--  kk    wheel  359 Nov  1  2017 .login
-rw-r--r--  kk    wheel  175 Nov  1  2017 .mailrc
-rw-r--r--  kk    wheel  229 May  4 16:29 .profile
-rw-r--r--  kk    wheel  108 Apr 15 12:50 .vimrc
-rw-r--r--  kk    wheel    0 Apr 21 17:44 .zshrc

作用函数的变体确切地就像ls除非你使用ls -l

ls () (
    add_filter=0
    while getopts ':l' opt; do
        case $opt in
            l)  add_filter=1 ;;
            1)  add_filter=0
        esac
    done

    command ls "$@" | 
    if [ "$add_filter" -eq 1 ]; then
        sed -E '2,$s/ +[0-9]+//'
    else
        cat
    fi
)

该函数会进行自己的命令行解析,以检测是否-l使用了该选项(并且稍后不会通过使用 禁用)。如果是,我们会设置一个标志。稍后,如果设置了标志,我们会通过过滤-1的输出。如果没有设置标志,我们只会将输出按原样传递通过。lssedcat

答案3

使用 ast-open (如果它已被包含并且位于 之前,ls也是 ksh93 的内置函数),您可以完全指定输出格式并省略其中的链接数 ( ):ls/opt/ast/bin/bin$PATH%3(nlink)u

ls -rSZ '%(mode)s %-8(uid)s %-8(gid)s %8(device:case::%(size)u:*:%(device)s)s %(atime)s %(name)s%(linkop:case:?*: %(linkop)s %(linkpath)s)s'

相关内容