首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按大小对文件名变量列表进行排序

按大小对文件名变量列表进行排序
EN

Unix & Linux用户
提问于 2020-06-16 15:12:48
回答 2查看 309关注 0票数 0

我正在尝试创建一个小脚本,它将接受文件名,然后按大小对列表进行排序,并对该列表执行命令。到目前为止,我已经:

代码语言:javascript
复制
#!/bin/bash
filenames="one \
           two \
           three"
for i in $filenames; do
...
done

它可以工作,但我想在点击for命令之前按文件大小对列表进行排序。

EN

回答 2

Unix & Linux用户

发布于 2020-06-16 15:57:04

如果您的文件名不包含任何新行,并且您的系统具有GNU stat,则可以:

  • 使用数组变量filenames
  • 使用stat打印每个文件的大小和文件名,然后在结果(反向数字)上使用sort,然后用cut删除第一个字段(大小),以获得按大小排序的文件名(第一个是最大的)。
  • 将结果提供给while循环以供进一步处理。
代码语言:javascript
复制
filenames=( one two three )
while IFS= read -r file; do
  echo "do something with $file"
done < <(stat --printf '%s\t%n\n' -- "${filenames[@]}" | sort -nr | cut -f2-)

与上面相同,但使用空字符作为分隔符(如果不能保证文件名不包含换行符;您还需要GNU sortcut):

代码语言:javascript
复制
filenames=( one two three )
while IFS= read -r -d 注意,对于符号链接类型的文件名,考虑的是链接本身的大小(相对于它所指向的文件)。将-L选项添加到stat以更改该选项。注意,它不适用于一个名为-的文件,因为stat将其解释为在stdin上打开的文件。使用./-来解决这个问题。\0' file; do
  printf 'do something with %s\n' "$file"
done < <(stat --printf '%s\t%n\0' -- "${filenames[@]}" | sort -znr | cut -zf2-)

注意,对于符号链接类型的文件名,考虑的是链接本身的大小(相对于它所指向的文件)。将D18选项添加到D19以更改该选项。

注意,它不适用于一个名为D20的文件,因为D21将其解释为在stdin上打开的文件。使用D22来解决这个问题。

票数 2
EN

Unix & Linux用户

发布于 2020-06-16 17:59:56

zsh中,与这是对关于按时间排序的类似问题的回答中的方法相同,它本身适应于就是那个,可以根据任意顺序对数组进行排序(详见后一个):

代码语言:javascript
复制
zmodload zsh/stat

array=(one two three...)

# store sizes in an "A"ssociative array:
typeset -A size
stat -nL -A size +size -- $array

# sort using the oe glob qualifier "n"umerically
sorted_array=(/(e['reply=($array)']noe['REPLY=$size[$REPLY]'])
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/593243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档