我试图打印当前用户的每个文件和目录的名称,但它一直打印一大长行。我希望每个文件都显示为一列,就像我打印 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/'
-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}'
这只会以您需要的格式打印属于当前用户的文件。