Bash:得到修改的`ls`-like输出(每行多个条目)

Dev*_*lar 5 bash ls multiple-columns

当您ls在命令行上没有其他选项的情况下调用时,每行会获得多个条目.

举例:

$ ls mydir/*.tar.gz
mydir/foo.tar.gz        mydir/bar.tar.gz        mydir/baz.tar.gz
Run Code Online (Sandbox Code Playgroud)

但是如果你想以某种方式修改输出,你每行会得到一个条目:

$ ls mydir/*.tar.gz | sed "s/\.tar\.gz//g"
mydir/foo
mydir/bar
mydir/baz
Run Code Online (Sandbox Code Playgroud)

有很多条目,这变得很麻烦 - 我希望多个对齐的列回来.

我试图想出沿着线的东西find mydir -name "*.tar.gz" -printf ...,或者... -exec ...,甚至(议员!) for file in $(find ...),但什么是我能想出的是真的很糟糕恶臭(认为计数器变量,以模和只是猜测终端宽度...) .

有一些优雅的方式来获得几个文件名的像香草多列输出ls,与他们(通过例如,具有修修补补后sed,basename等)?

rgh*_*ome 5

(令人惊讶的命名)column命令将做你想要的.

ls | column -c 80
Run Code Online (Sandbox Code Playgroud)

将以80列显示的列显示输出.您可能必须等待输出,因为它必须先确定项目的宽度才能格式化任何内容.

当然,它将适用于任何命令.

您可以使用COLUMNS变量找到您的列(这可能取决于您的shell - 类型set以查看变量列表并找出它),或使用该tput cols命令.