问题描述
如果我有两个文件tmp.txt
和tmp.pdf
,一个文件又一个文件,则当我键入ls -al tmp.*
时,一切都是正确的,我得到了这个输出
-rw-r--r-- 1 simon simon 615316 Oct 17 20:55 tmp.pdf
-rw-r--r-- 1 simon simon 0 Oct 17 20:55 tmp.txt
出于无关紧要的原因,我希望能够将两个单独的ls -al
命令的输出写入一个文件,然后cat
该文件并获得相同的输出。但是,当然,如果我这样做:
ls -al tmp.txt > foo
ls -al tmp.pdf >> foo
然后cat foo
,我明白了
-rw-r--r-- 1 simon simon 0 Oct 17 20:55 tmp.txt
-rw-r--r-- 1 simon simon 615316 Oct 17 20:55 tmp.pdf
是否有一种方法可以模仿ls -al
产生的合理输出?显然,我可以使用wc -c tmp.pdf
等来找出哪个输出最大,但是如何将这些信息转换为将必要的空格数放在第一行中的0之前的代码?非常感谢您的任何建议。
解决方法
是的。只需使用column
myuser@mypc:~$ (ll tmp.small; ll tmp.big) | column -t
-rw-r--r-- 1 myuser myuser 0 Oct 18 11:24 tmp.small
-rw-r--r-- 1 myuser myuser 113616 Oct 18 11:42 tmp.big
但是,如果您的文件名包含空格,则这些名称将无法正确打印。如果您的column
支持-l
选项,那么最简单的解决方法是更改为column -t -l 9
以将列总数限制为9。另一种解决方法是使用stat
进行模拟ls
输出
myuser@mypc:~$ (
> stat --printf="%A\t%h\t%U\t%G\t%s\t%y\t%n\n" "tmp with space.txt"
> stat --printf="%A\t%h\t%U\t%G\t%s\t%y\t%n\n" tmp.small
> stat --printf="%A\t%h\t%U\t%G\t%s\t%y\t%n\n" tmp.big
> ) | column -t -s $'\t'
-rw-r--r-- 1 myuser myuser 1307 2020-10-18 12:08:45.360000000 +0700 tmp with space.txt
-rw-r--r-- 1 myuser myuser 0 2020-10-18 11:24:21.650000000 +0700 tmp.small
-rw-r--r-- 1 myuser myuser 113616 2020-10-18 11:42:04.150000000 +0700 tmp.big
名称中带有制表符或换行符的文件仍然无法使用。您可以尝试使用stat --printf="%A\0%h\0%U\0%G\0%s\0%Y\0%n\n" tmp* | column -t -s $'\0' -l 9
将定界符更改为null,但是我的column
无法将\0
识别为定界符。不确定其他列的版本,只需在您的PC上尝试一下