我正在尝试使用 ls 来获取有关文件和目录的信息。每当文件/目录有空格时,我当前的命令就无法正确获取名称。
我用它来列出目录中的所有文件/目录:
ls -al --time-style=+%s . | awk '{if ($7 != ".." && $7 != "." && $1 != "total") print $1"\t"$3"\t"$5"\t"$6"\t"$7}'
假设我的密码中有 3 个目录“no-spaces-dir”、“some dir”、“some other dir”,这将是输出:
drwxr-xr-x. testuser 4096 1349853378 no-space-dir
drwxr-xr-x. testuser 4096 1349853387 some
drwxr-xr-x. testuser 4096 1349853359 two
我想说这是我的 awk 部分的问题。所以 7 美元应该是目录名称,显然我可以添加 $8 和 $9 来获得我设置的示例所需的输出,但我可能并不总是知道目录只有 1 或 2 个空格。
如何保留其他信息(文件/目录权限、用户、空间、时间戳)并在命令的输出中获取全名?
答案1
问题是 awk 正在解析使用空格作为字段分隔符的输入。当字段中有空格时,这会带来麻烦。
ls
您可以使用stat(1)
“dotglob”bash shell 选项来获取所需内容,而不是解析 的输出。
shopt -s dotglob # Enable * to match files starting with a dot
stat -c $'%A\t%U\t%s\t%Y\t%n' *
格式字符串以您想要的格式输出您想要的字段。使用 $'...' 允许将 \t 扩展为制表符。如果需要,您可以插入实际的制表符并删除前导 $。
有关 dotglob 的详细信息,请阅读bash(1)
手册页,并关注 GLOBIGNORE。阅读stat(1)
手册页,了解可以在格式字符串中放入哪些内容。
答案2
正如已经提到的,解析ls
并不是打印目录内容的最佳方法。不过,你的问题很容易解决。
由于文件/目录名称始终是最后一列(或多列),因此您可以从 $7 打印到最后一列,而不是打印 $7。您可以通过以下方式执行此操作:
substr($0, index($0, $7))
所以你的完整命令是:
ls -al --time-style=+%s . | awk '{if ($7 != ".." && $7 != "." && $1 != "total") print $1"\t"$3"\t"$5"\t"$6"\t" substr($0,index($0,$7));}'
还请注意,检查是否$1 != "total"
不是一个好主意,因为它不适用于本地化系统(可能total
是其他词)。我建议使用NF>6
以确保您有足够的列。