当您在命令行上调用 ls
时没有其他选项,您每行会得到多个条目。
人为的例子:
$ ls mydir/*.tar.gz
mydir/foo.tar.gz mydir/bar.tar.gz mydir/baz.tar.gz
但是如果你想以某种方式修改输出,你每行得到一个条目:
$ ls mydir/*.tar.gz | sed "s/\.tar\.gz//g"
mydir/foo
mydir/bar
mydir/baz
有很多条目,这变得很麻烦——我想要多个对齐的列。
我试图按照 find mydir -name "*.tar.gz"-printf ...
或 ... -exec .. .
,甚至(yuk!)for file in $(find ...)
,但是我能想到的任何东西都非常不优雅(想想计数器变量,取模和只是猜测终端宽度...)。
是否有一些优雅的方法可以在多列输出中获取几个文件名,比如使用 vanilla ls
,在修改它们之后(通过例如 sed
,basename
等)?
最佳答案
(令人惊讶的命名)column
命令将执行您想要的操作。
ls | column -c 80
这将在 80 宽显示器的列中显示输出。您可能需要等待输出,因为它必须先计算出项目的宽度,然后才能格式化任何内容。
它适用于任何命令。
您可以使用 COLUMNS
环境变量找到您的列宽(这可能取决于您的 shell - 输入 set
以查看变量列表并计算出来),或使用 tput cols
命令。
关于Bash:获取修改后的 `ls` 类输出(每行多个条目),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28966423/