列出有关带有空格的文件/目录的信息

列出有关带有空格的文件/目录的信息

我正在尝试使用 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以确保您有足够的列。

相关内容