如何修改我的 `ls` 命令?

Inc*_*ito 12 command-line

当我输入时ls,我会得到普通列表,或者当我输入时,ls -la我会得到一个包含所有内容的详细信息...

但我讨厌 的布局ls,它对我的​​大部分使用来说都是不直观的。

有什么方法可以修改(不改变源代码ls,但是 bash 脚本是可以的)ls所以它是显示而不是

-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename0
-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename1
-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename2
drwx------ 13 user group 123546 2011-01-01 11:11 directory0
-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename3
drwx------ 13 user group 123546 2011-01-01 11:11 directory1
Run Code Online (Sandbox Code Playgroud)

我可以得到一个更像的列表:

DIRS
directory0 1293880260 700 user:group
directory1 1293880260 700 user:group

FILES
filename0 1293880260 751 user:group
filename1 1293880260 755 user:group
filename2 1293880260 777 user:group
filename3 1293880260 705 user:group
Run Code Online (Sandbox Code Playgroud)

或者其他一些变体。

同时,保留使用标志和其他选项的能力。

Oli*_*Oli 15

您可以编写一个 bash 脚本~/bin/ls,该脚本应覆盖/bin/ls. 记得跑chmod +x ~/bin/ls

我刚刚写的这似乎完成了您想要完成的大部分工作(包括传递额外的参数)

#!/bin/bash

DIRS="`/bin/ls --color=auto -l $@ | grep ^d`"
FILES="`/bin/ls --color=auto -l $@ | grep ^\-`"

if [ "$DIRS" ]
then
    echo "DIRECTORIES"
    echo -e "$DIRS\

"
fi

if [ "$FILES" ]
then
    echo "FILES"
    echo "$FILES\

"
fi
Run Code Online (Sandbox Code Playgroud)

有人可能想稍微整理一下或改进输出格式,但你去了。随心所欲,随心所欲。

这是一些真正的示例输出:

ls
DIRECTORIES
drwxr-xr-x 4 oli oli     4096 2010-12-16 15:40 markitup
drwxr-xr-x 7 oli oli     4096 2011-01-16 16:58 media
drwxr-xr-x 3 oli oli     4096 2010-12-16 15:41 post
drwxr-xr-x 9 oli oli     4096 2010-09-16 05:23 templates

FILES
-rw-r--r-- 1 oli oli  5361664 2010-09-06 16:32 db.db
-rw-r--r-- 1 oli oli        0 2008-12-11 09:22 __init__.py
-rwxr-xr-x 1 oli oli      542 2008-12-11 09:22 manage.py
-rw-r--r-- 1 oli oli       13 2010-03-23 18:14 settingsdev.py
-rw-r--r-- 1 oli oli     2642 2010-12-16 15:40 settings.py
-rw-r--r-- 1 oli oli     1818 2010-12-16 15:40 urls.py
-rw-r--r-- 1 oli oli      432 2010-06-22 20:54 views.py
Run Code Online (Sandbox Code Playgroud)

并有论据:

ls -a
DIRECTORIES
drwxr-xr-x  8 oli oli     4096 2011-01-12 00:46 .
drwxr-xr-x 19 oli oli     4096 2011-04-13 17:24 ..
drwxr-xr-x  6 oli oli     4096 2010-02-03 13:50 .bzr
drwxr-xr-x  4 oli oli     4096 2010-12-16 15:40 markitup
drwxr-xr-x  7 oli oli     4096 2011-01-16 16:58 media
drwxr-xr-x  3 oli oli     4096 2010-12-16 15:41 post
drwxr-xr-x  9 oli oli     4096 2010-09-16 05:23 templates

FILES
-rw-r--r--  1 oli oli       65 2010-03-27 07:58 .bzrignore
-rw-r--r--  1 oli oli  5361664 2010-09-06 16:32 db.db
-rw-r--r--  1 oli oli        0 2008-12-11 09:22 __init__.py
-rwxr-xr-x  1 oli oli      542 2008-12-11 09:22 manage.py
-rw-r--r--  1 oli oli       13 2010-03-23 18:14 settingsdev.py
-rw-r--r--  1 oli oli     2642 2010-12-16 15:40 settings.py
-rw-r--r--  1 oli oli     1818 2010-12-16 15:40 urls.py
-rw-r--r--  1 oli oli      432 2010-06-22 20:54 views.py
Run Code Online (Sandbox Code Playgroud)


ænd*_*rük 7

这是我的快速刺戳。

$ function lss { ls -l --group-directories-first --time-style +%s $@ | grep -v '^total' | awk 'BEGIN {print("DIRS")} {if (f!=1 && $1 ~ /^-/) {print "\nFILES"; f=1}; printf("%s\t%s %s %s:%s\n", $7, $6, $1, $3, $4);}'; }
$ alias ls='lss'
$ ls
DIRS
directory0  1305901476 drwxr-xr-x ak:ak
directory1  1305901476 drwxr-xr-x ak:ak

FILES
filename0   1305901484 -rw-r--r-- ak:ak
filename1   1305901484 -rw-r--r-- ak:ak
filename2   1305901484 -rw-r--r-- ak:ak
filename3   1305901484 -rw-r--r-- ak:ak
Run Code Online (Sandbox Code Playgroud)

这种方法的好处是它不需要多个目录遍历并在准备好时打印输出。尝试运行此后touch filename{0..10000}作为测试。

functionalias线放入~/.bashrc以使其永久化。

Oli 的基准测试:

oli@bert:~/Desktop$ mkdir test
oli@bert:~/Desktop$ cd test
oli@bert:~/Desktop/test$ mkdir dir{0..100000}
oli@bert:~/Desktop/test$ touch filename{0..100000}

oli@bert:~/Desktop/test$ time /bin/ls>/dev/null

real    0m0.975s
user    0m0.860s
sys         0m0.110s

oli@bert:~/Desktop/test$ time ls --group-directories-first -l >/dev/null

real    0m1.810s
user    0m1.210s
sys         0m0.580s


oli@bert:~/Desktop/test$ time lss>/dev/null  # ændrük's method

real    0m2.035s
user    0m1.810s
sys         0m0.780s

oli@bert:~/Desktop/test$ time ~/bin/ls>/dev/null  # Oli's method

real    0m5.496s
user    0m4.290s
sys         0m1.460s
Run Code Online (Sandbox Code Playgroud)

  • 为您的帖子添加了一些基准测试(正如您所提到的)。是的,超过 100,000 个目录和 100,000 个文件,您只需要不到一半的时间。但是 `ls` 本身仍然要快得多。无论哪种方式,这都是一个边缘情况。大多数人从未有过如此庞大的目录列表。对于正常人来说,几乎没有可观察到的差异。不错的`awk`ing。+1 (4认同)

Rin*_*ind 4

ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"

按顺序显示...目录、普通文件、链接。

让它成为一个别名,然后你就可以开始了。

找到了另一种方法:

ls -l --color -h --group-directories-first

这个首先处理目录并为文件名着色。

~/.bashrc您可以为此命令创建一个别名,如下所示:

alias ls1='ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"

示例输出:

drwxr-xr-x 5 96 2011-05-20 13:41 。
drwxr-xr-x 16 xxxx uuuu 96 2010-03-05 12:34 ..
drwx------ 2 xxxx uuuu 96 2009-02-13 14:31 .ssh
drwxrwxr-x 2 xxxx uuuu 96 2009-12-03 13:49 .xxx
drwxrwxr-x 5 xxxx uuuu 96 2010-12-06 15:51 xxxxxx
-rw-------- 1 xxxx uuuu 05 2011-05-20 14:12 .bash_history
-rw-r--r-- 1 xxxx uuuu 20 2009-02-12 09:33 .bash_logout
-rw-r--r-- 1 xxxx uuuu 29 2009-03-06 11:47 .bashrc
-rw-r--r-- 1 xxxx uuuu 80 2011-05-20 13:42 fff
-rw-rw-r-- 1 xxxx uuuu 03 2011-05-18 10:21 dffff

或者对于第二个:alias ls2=ls -l --color -h --group-directories-first

示例输出:

drwxrwxr-x 5 xxxx uuuu 4.0K 2010-12-06 15:51 ddddd
-rw-r--r-- 1 xxxx uuuu 339M 2011-05-20 13:42 sssss
-rw-rw-r-- 1 xxxx uuuu 4.6M 2011-05-18 10:21 dxsssss
-rwxrwxr-x 1 xxxx uuuu 68 2011-02-22 15:55 5555
-rwxr--r-- 1 xxxx uuuu 20K 2010-12-06 16:11 ffff
ddddd 将采用另一种颜色。添加-a还包括隐藏文件。

您创建了命令 ls1 和 ls2 来执行此操作。


Flo*_*sch 1

ls不支持太多的输出定制。

使用

 ls --group-directories-first -l
Run Code Online (Sandbox Code Playgroud)

首先获取目录。

查看limo(默认情况下未安装),以获取支持更多输出自定义的 ls 替代方案(但不支持 的所有选项ls