是否可以仅使用 ls 实用程序中的选项仅列出目录中每个文件的文件名和大小?

rau*_*aul 6 command-line bash

假设我的目录“Historic_Documents”具有以下文件/大小:“Declaration_of_Independence.txt”342 字节、“Magna_Carta.txt”1580 字节和“Treaty_of_Versaille.txt”752 字节。是否可以仅使用 ls 选项来获得以下输出?

342 Declaration_of_Independence.txt
1580 Magna_Carta.txt
752 Treaty_of_Versaille.txt
Run Code Online (Sandbox Code Playgroud)

bac*_*c0n 10

如何ls -l使用 while 循环解析详细列表的输出
我查看了这个问题,并认为这可以通过find轻松完成:

$ find -maxdepth 1 -type f -printf '%s %f\n'
Run Code Online (Sandbox Code Playgroud)

或者

#!/bin/bash
for i in *; do
    stat --format '%s %N' "$i"
done
Run Code Online (Sandbox Code Playgroud)

(%N 将遵守 QUOTING_STYLE 环境变量;默认为 'shell-escape')。

获取大小的唯一方法ls是通过详细列表。通过使用read读取ls输出;赋值给变量前的词会去掉前后空格,第一个词赋值给第一个变量,以此类推,当所有变量都赋值后,剩下的词会加到最后一个变量中,这样我们就可以 保留文件名上的空格。

#!/bin/bash
while read -r p c u g s e n; do
    [[ $p = total ]] && continue || { echo -n "$s "; eval "ls -d $n"; }
done < <(ls -Lpl --time-style=+%s --quoting-style=shell-escape)
Run Code Online (Sandbox Code Playgroud)

(使用echo -n "$s "; eval "ls -d $n"有点过分,但它显示了如何将 'shell-escape' 与其他命令一起使用。如果您只想显示大小和名称的输出,请 echo "$s $n"改用)

读取变量:

-rwxr-xr-x 1 bac0n bac0n 209 1572207800 script.sh
     ^     ^   ^     ^    ^      ^         ^
     p     c   u     g    s      e         n
Run Code Online (Sandbox Code Playgroud)

ls选项:

  • -L 显示符号链接的文件信息时,显示链接引用的文件的信息,而不是链接本身的信息。
  • -p 将 / 指示符附加到目录。
  • -l 使用长列表格式。
  • --time-style带 -l 的时间/日期格式;在脚本中将其设置为纪元是一个很好的做法。
  • --quoting-style 使用 POSIX 提议的 '$''' 语法引用不可打印的字符。

测试目录:

$ ls
a  'b'$'\r''c'   'd'$'\n''e'  "f'g"   h,i  'j k'  'l  m'  'n  '  '  o'
Run Code Online (Sandbox Code Playgroud)


mch*_*hid 8

仅使用ls选项,您可以执行以下操作:

ls -sd --block-size=1 --format=single-column *
Run Code Online (Sandbox Code Playgroud)

以下是选项:

  • -sd说以块为单位打印分配的文件大小,该d选项从输出中删除目录“total”行

  • --block-size=1 每个大小单位打印 1 个字节(而不是 K)

  • --format=single-column 说将结果打印为单列

  • *ls在当前目录中的所有文件上运行,并且在使用该d选项时需要

这假设您当前的目录是Historic_Documents.


编辑:

因为您想要文件内容的大小,所以我认为您不能只使用ls选项来做到这一点。但是,您可以使用du来获得您想要的确切结果:

du -b *
Run Code Online (Sandbox Code Playgroud)

-b--bytes选择打印以字节为单位的实际文件大小这也等同于选项:--apparent-size --block-size=1

表观大小是文件的大小(类似于 列出的大小ls -l),而不是分配的文件大小或磁盘使用情况。

  • @user3140225 `ls -s` 打印文件在文件系统上占用多少空间,`ls -l` 打印文件包含多少数据。此方法仅使用“ls”选项生成问题中要求的相同格式。在 OP 指定“大小”的含义之前,问题是模棱两可的。 (2认同)
  • @raul 在实践中查找文件大小有点复杂。大多数文件都很简单:文件系统分配 X 个块,然后这些块中有实际的数据量。还有稀疏文件——文件系统为它们分配了一堆块,但其中可能没有数据。做例如`truncate -s 1024 sparcefile.txt`。`ls -l sparcefile.txt` 会告诉你文件大小是 1024,但里面没有数据,也没有实际存储在磁盘上,只有简短的元数据。 (2认同)

xen*_*oid 5

只是ls,不,但是 stat(如果有的lsstat):

stat -c "%s %n" *
Run Code Online (Sandbox Code Playgroud)
  • stat使用格式 ( -c, --format) 是获取文件数据最灵活的方式
  • 尽管手册页中没有明确说明,但您可以在字段上使用宽度和精度说明符,例如在 8 列中列出大小:

    stat -c "%8s %n" *
    
    Run Code Online (Sandbox Code Playgroud)