以下是根据 man ls 页面进行的总结。
1. 关于 -d 选项。
根据 man 里的描述,-d 参数要完成的事情是:
-d Directories are listed as plain files (not searched recursively)
看两个例子,例子里 abc 是一个目录:
$ ls -l abc total 0 drwxr-xr-x 2 wxl24life staff 68 Mar 31 15:07 abcd -rw-r--r-- 1 wxl24life staff 0 Mar 31 15:07 bb.txt
$ ls -ld abc drwxr-xr-x 4 wxl24life staff 136 Mar 31 15:07 abc
可以看到,-d 选项会把目录当做一个普通的文件,与 -l 搭配使用时,显示该目录文件的属性信息。而不是显示目录里面的内容。
2. 关于排序:
- ls 命令默认会按照文件名字母序排序
- 如果使用 -t 选项,将首先按照文件的最后修改时间排序(时间越新越靠前),之后再按字母顺序排
- -T 结合 -l 可将时间显示为 hh:mi:ss 的形式,但不会按时间排序,因而不会影响默认字母排序
- -S 按文件大小排序,越大越靠前
- -u 结合 -l 选项可以看到每个文件最后被访问的时间,并且也会按该时间排序
- 以上影响排序的选项如果结合 -r 选项一起使用,则按相反顺序排列
3. 其他:
ls 默认是按照每个文件名一行的方式输出的,有个例外:如果是在 terminal 下执行 ls,会显示在一行里。
对比一下
$ ls aa.txt abc0.txt abc2.txt abc4.txt abc6.txt abc8.txt bcd ls-noopt.log abc abc1.txt abc3.txt abc5.txt abc7.txt abc9.txt ls-m.log ls.log
$ ls > ls-noopt.log && cat ls-noopt.log aa.txt abc abc0.txt abc1.txt abc2.txt abc3.txt abc4.txt abc5.txt abc6.txt abc7.txt abc8.txt abc9.txt bcd ls-m.log ls-noopt.log ls.log
如果使用 -m 选项,则会打破这种默认输出方式,输出后所有文件名在一行显示,中间使用逗号分隔。
$ ls -m aa.txt, abc, abc0.txt, abc1.txt, abc2.txt, abc3.txt, abc4.txt, abc5.txt, abc6.txt, abc7.txt, abc8.txt, abc9.txt, bcd, ls-m.log, ls-noopt.log, ls.log
$ ls -m > ls-m.log && cat ls-m.log aa.txt, abc, abc0.txt, abc1.txt, abc2.txt, abc3.txt, abc4.txt, abc5.txt, abc6.txt, abc7.txt, abc8.txt, abc9.txt, bcd, ls-m.log, ls-noopt.log, ls.log
------
2014/04/07 新增:
关于 -v 选项的使用。先看下 man 下的说明:
-v Force unedited printing of non-graphic characters; this is the default when output is not to a terminal.
>>> 什么是 non-graphic character?
wikipedia 上有它的反义词 - graphic character - 说明。按我的理解,non-graphic charater 指的是在某种特定的字符编码下无法正常显示的字符,因而 “乱码” 应该可以归于这一类里。
>>> 我为什么会用到这个选项?
在 Mac OS X 下安装了 iterm2 终端,终端设置里使用的字符编码是 UTF-8,但是长期以来,使用 ls 命令都无法正常显示任意路径下的中文文件名。举例如下:
$ ls C ????????????.pdf Go ???????????? ?????????.pdf Python ???????????? ?????????.pdf README.md
尝试调整字符编码无法解决问题。
实际上,该问题可以通过使用 ls 的 -v 选项完美解决,如下:
$ ls -v C 学习笔记.pdf Go 学习笔记 第二版.pdf Python 学习笔记 第二版.pdf README.md
另外,ls 无法正常显示中文的问题只是在终端显示时才会碰到,如果先输出到文件再查看,则不需要 -v 选项就可以正常显示中文文件名:
$ ls > hanzi.log && cat hanzi.log C 学习笔记.pdf Go 学习笔记 第二版.pdf Python 学习笔记 第二版.pdf README.md hanzi.log
为了避免每次使用 ls 时都输入 -v ,可以修改 ls 的别名并添加 -v 选项,示例如下:
$ alias ls='ls -vG' $ which ls ls: aliased to ls -vG $ ls C 学习笔记.pdf Go 学习笔记 第二版.pdf Python 学习笔记 第二版.pdf README.md hanzi.log
当然,为了使以上设置长期生效,请自行在 shell 配置文件(如 ~/.bashrc,~/.zshrc 等)下添加上述 alias 语句。