假设我的目录“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)
仅使用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
),而不是分配的文件大小或磁盘使用情况。
只是ls
,不,但是 stat
(如果有的ls
话stat
):
stat -c "%s %n" *
Run Code Online (Sandbox Code Playgroud)
stat
使用格式 ( -c
, --format
) 是获取文件数据最灵活的方式尽管手册页中没有明确说明,但您可以在字段上使用宽度和精度说明符,例如在 8 列中列出大小:
stat -c "%8s %n" *
Run Code Online (Sandbox Code Playgroud)