0

如果我有两个文件,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.pdfetc 来确定哪个输出最大,但是我如何将这些信息转换为在第一行的 0 之前放置必要数量的空格的代码?非常感谢您的任何建议。

4

1 回答 1

1

是的。只需使用column

$ (ll tmp.small;ll tmp.big) | 列-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输出

$ (
> 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
> ) | 列 -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

但是,名称中带有制表符或换行符的文件仍然不起作用。您可以尝试将分隔符更改为 null ,stat --printf="%A\0%h\0%U\0%G\0%s\0%Y\0%n\n" tmp* | column -t -s $'\0' -l 9但不知何故我column无法识别\0为分隔符。不确定其他列版本,只需在您的 PC 上尝试一下即可

于 2020-10-18T05:35:52.153 回答