gpt4 book ai didi

linux - 不使用 -S 选项对 ls -alh 的输出值进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 10:26:03 24 4
gpt4 key购买 nike

我有一个脚本递归遍历目录并附加运行 ls -alh --block-size=KB | 的结果grep ^\- 到一个文件。然后,我需要通过减小文件大小来对生成的文件进行排序,其方式与使用 -S 选项的方式相同(如果它在调用 ls 的位置使用的话)。

最佳答案

尝试解析 ls 的许多问题在 Why you shouldn't parse the output of ls 中都有很好的介绍。和 Fixing Unix/Linux/POSIX Filenames了解其他人在您之前尝试过的内容。

您的方法无法可靠运行的其他一些原因:

  1. 如果您在设备边界上递归,某些版本的 ls 可能会添加一列来显示新的设备 ID 并放弃您的排序和解析;
  2. 您正在使用 sed 删除 ls -h 输出的 kB/mB/gB 大小。这会将 2 字节文件、2 KB 文件和 2 兆字节文件一起排序为相同大小。
  3. ls 的输出在您通过管道传输或在终端显示时发生变化,同时也改变了解析/排序的逻辑。

解决方案是使用 glob 并根据添加到 ls 输出的列进行排序。

我们可以使用 dd 创建一些已知大小的测试文件列表:

dd if=/dev/zero of=A  bs=2  count=1
dd if=/dev/zero of=B bs=1024 count=2
dd if=/dev/zero of=C bs=1024 count=3
dd if=/dev/zero of=D bs=1024 count=150
dd if=/dev/zero of=E bs=1024 count=2000

导致:

$ ls -lh *
-rw-r--r-- 1 andrew wheel 2B Jan 8 20:52 A
-rw-r--r-- 1 andrew wheel 2.0K Jan 8 20:52 B
-rw-r--r-- 1 andrew wheel 3.0K Jan 8 20:52 C
-rw-r--r-- 1 andrew wheel 150K Jan 8 20:52 D
-rw-r--r-- 1 andrew wheel 2.0M Jan 8 20:52 E

如果通过 -S 开关对 ls 的输出进行排序:

$ ls -lhS *
-rw-r--r-- 1 andrew wheel 2.0M Jan 8 20:52 E
-rw-r--r-- 1 andrew wheel 150K Jan 8 20:52 D
-rw-r--r-- 1 andrew wheel 3.0K Jan 8 20:52 C
-rw-r--r-- 1 andrew wheel 2.0K Jan 8 20:52 B
-rw-r--r-- 1 andrew wheel 2B Jan 8 20:52 A

您的方法是删除第五列中的 M KB,然后对其进行排序。这将导致 A、B 和 E 一起排序。


(可能粗略地ls 的输出进行排序,如下所示:

$ ls -al | grep ^\- | sort -nrk 5
-rw-r--r-- 1 andrew wheel 2048000 Jan 8 20:52 E
-rw-r--r-- 1 andrew wheel 153600 Jan 8 20:52 D
-rw-r--r-- 1 andrew wheel 3072 Jan 8 20:52 C
-rw-r--r-- 1 andrew wheel 2048 Jan 8 20:52 B
-rw-r--r-- 1 andrew wheel 2 Jan 8 20:52 A

但这不会产生你所拥有的 -h 的输出......)


正确的方法是使用 Decorate / Sort / Undecorate pattern有一个球体。

for fn in *; do
[ -f "$fn" ] || continue
c1=$(($(wc -c < "$fn")))
c2=$(ls -alh "$fn")
printf "%s\t%s\n" "$c1" "$c2"
done | sort -nrk 1 | cut -f 2

结果:

-rw-r--r--  1 andrew  wheel   2.0M Jan  8 20:52 E
-rw-r--r-- 1 andrew wheel 150K Jan 8 20:52 D
-rw-r--r-- 1 andrew wheel 3.0K Jan 8 20:52 C
-rw-r--r-- 1 andrew wheel 2.0K Jan 8 20:52 B
-rw-r--r-- 1 andrew wheel 2B Jan 8 20:52 A

这与使用 ls -lhS 相同

如果您递归文件树并写入文件,一般方法是相同的。

关于linux - 不使用 -S 选项对 ls -alh 的输出值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41536862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com