Labels

Friday, March 29, 2013

列出存档文件信息的优雅命令

ls -AFlhR --full-time | cut -f 5- -d " " | sed '/^[0-9 ]/{s/\.[0-9]\{9\}.\{2\}0800//};' > file_list.txt 
测试文件的内容如下:
woops@woopsU:~/tmp$ ls -RF
.:
font_cn.txt  lyric.lrc  missfont.log  new_dir/

./new_dir:
fog.aux  fog.dvi  fog.log  fog.pdf  fog.tex  fog.tex~
woops@woopsU:~/tmp$ 
我要想得到的最终结果是:
  • 需要出现的文件信息:创建日期、文件大小、文件名。其余信息都是不必要的,有时反而是一种干扰。
  • 递归地列出所有的子目录和子目录中的文件。
  • 把输出结果保存到文本文件。
下面详细解释每个参数。

ls -AFlhR --full-time

使用带l参数的ls -l命令输出长格式,结果如下:
长格式ls -l 的输出

仔细观察输出可以发现,输出信息的文件时间没有年份,而且月份不是用数字表示的,这样不利于进一步处理。所以我们选用 --full-time 选项得到完整的日期。
  • -A:不显示.和..这两个文件。
  • -F:为不同类型的文件添加记号(*/=>@|),方便区分目录和普通文件。
  • -l:使用长格式,列出文件的详细信息。
  • -h:使用易读的格式显示文件大小,即智能选用K、M、G等单位显示文件大小。如果要得到精确的文件大小,不要使用这个参数。
  • -R:遍历子目录。列出以指定文件夹(默认为当前目录)为根的目录树上的所有文件和文件夹。
  • --full-time:使用完整的时间格式。
因为在Linux里单个字符的选项可以写在一起,所以就得到了上面这个命令。现在的输出如下:

ls -AFlhR --full-time
上面命令的输出如果以空格为界,可以分为9列。如下图,我们不需要1-4列和第8列,第7列不需要秒以后的时间。

cut -f 5- -d " "

要除去前4列的内容,我们使用cut命令。
  • -f 5-:指定要留下来的字段(field),也就是上图中用数字分隔的列。后面可以使用逗号分隔的单个数字,也可以用m-,m-n,-m分别指定m列以后,m到n列,前m列。本例中是第5列及其后面的列。
  • -d " ":我们要明确什么是“一列”,在cut命令中,默认的列分隔符为Tab(在文本编辑器里按键盘上的Tab键产生的不可见字符),而这里我们显然需要空格作为列分隔符(delimiter),使用-d选项指定列分隔符。
另外,命令中的"|"表示管道(pipeline),管道在Linux操作系统中是一个非常重要的概念。它把管道左边命令产生的输出作为管道右边命令的输入。在这里,ls 产生的输出通过管道送到第一个cut命令中。
现在命令产生的输出如下:

No comments:

Post a Comment