我正在尝试创建一个小脚本,它将接受文件名,然后按大小对列表进行排序,并对该列表执行命令。到目前为止,我已经:
#!/bin/bash
filenames="one \
two \
three"
for i in $filenames; do
...
done它可以工作,但我想在点击for命令之前按文件大小对列表进行排序。
发布于 2020-06-16 15:57:04
如果您的文件名不包含任何新行,并且您的系统具有GNU stat,则可以:
filenamesstat打印每个文件的大小和文件名,然后在结果(反向数字)上使用sort,然后用cut删除第一个字段(大小),以获得按大小排序的文件名(第一个是最大的)。while循环以供进一步处理。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 sort和cut):
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来解决这个问题。
发布于 2020-06-16 17:59:56
在zsh中,与这是对关于按时间排序的类似问题的回答中的方法相同,它本身适应于就是那个,可以根据任意顺序对数组进行排序(详见后一个):
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]'])https://unix.stackexchange.com/questions/593243
复制相似问题