这是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 -al
将awk
其删除:
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}'
}
该函数的行为方式相同,无需考虑和转义单引号和双引号。我使用la
asll
给出了语法错误,因为它已经是我的环境中的别名。
答案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
的输出。如果没有设置标志,我们只会将输出按原样传递通过。ls
sed
cat
答案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'