如何将 ls -l 的文件和目录列表排列在一列中而不是水平打印?

如何将 ls -l 的文件和目录列表排列在一列中而不是水平打印?

我试图打印当前用户的每个文件和目录的名称,但它一直打印一大长行。我希望每个文件都显示为一列,就像我打印 ls -l 时一样。

您不必帮助解决此问题,但为了更好的上下文,我尝试确保每个文件名后面显示冒号“:”,以及第一个字段中的组权限。例如,它可能看起来像“file/dir:---”或“file/dir:r--”

echo $(ls -l /home/$(whoami) | awk '{if (NR>1) print $9}'): $(ls -l /home/$(whoami) | awk '{if (NR>1) print $1}')

答案1

ls -1

将每行列出一个文件。ls当 的输出重定向到非终端的任何地方时,这是默认设置。

为了获得你想要的输出,你最好做类似的事情

ls -l | awk 'NR > 1 { print $9 ":" $1 }'

或者更好的是,

stat -c "%n:%A" *

尽管这两者都列出了所有权限,而不仅仅是组权限。要仅查看组权限,请使用

ls -l | awk 'NR > 1 { print $9 ":" substr($1,5,3) }'

或者

stat -c "%n:%A" * | sed 's/....\(...\)...$/\1/'

(向用户1404316为了表达sed方式)。

-parsing变ls体不处理文件名中的空格和其他空白字符,因此它们一般不应该使用

答案2

find如果您可以访问包含 GNU 扩展的版本,则有一个更简单的解决方案。为了找到答案,请运行man find并搜索-printf(为此,请先按/^ *-printf)。如果您这样做,那么您很幸运,因为您的解决方案可能是:

find . -maxdepth 1 -type f -printf "%f: %M\n" | sed 's/....\(...\)...$/\1/'

作为奖励,这个答案将在文件名包含冒号字符的特殊情况下起作用。

答案3

如果您只需要当前用户的文件。

ls -l | awk -v var="$(whoami)" '$4 == var {print $9}'

这只会以您需要的格式打印属于当前用户的文件。

相关内容