![我如何修改我的“ls”命令?](https://linux22.com/image/1035254/%E6%88%91%E5%A6%82%E4%BD%95%E4%BF%AE%E6%94%B9%E6%88%91%E7%9A%84%E2%80%9Cls%E2%80%9D%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
当我输入时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
我可以得到更像这样的列表:
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
或者其他一些变化。
同时,保留使用标志和其他选项的能力。
答案1
您可以编写一个名为的 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
有人可能想稍微整理一下或改进一下输出格式,但就这样了。您可以随意处理。
以下是一些真正的示例输出:
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
并附有参数:
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
答案2
以下是我的快速尝试。
$ 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
这种方法的好处是不需要多次遍历目录,并在准备好后打印输出。尝试在之后运行此程序touch filename{0..10000}
进行测试。
将function
和alias
线放入~/.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
答案3
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 ffffddddd 将采用另一种颜色。添加
-a
还包括隐藏文件。
并且您创建了命令 ls1 和 ls2 来执行此操作。
答案4
ls
不支持太多输出定制。
使用
ls --group-directories-first -l
首先获取目录。
看一下豪华轿车(默认情况下不安装)作为 ls 的替代方案,支持更多输出自定义(但不支持所有选项ls
)