复制两次使用ls时ls所做的正确调整

问题描述

如果我有两个文件tmp.txttmp.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上尝试一下