根据大小对子目录中的每个文件进行处理

时间:2018-12-28 01:09:53

标签: bash

我现在开始编写脚本,到目前为止已经掌握了

#!/bin/bash

for d in $(find /home/username/ -maxdepth 1)
do
        if [[ $d == *.txt ]]
        then
                echo $d
        fi
done

这按预期执行,但是我希望它根据文件的大小(从最大到最小)为我提供文件名。我已经找到了一些与半相关问题的答案,并看到了诸如du和使用find的printf选项之类的东西,但是我还无法将它们融合在一起。

3 个答案:

答案 0 :(得分:3)

使用stat命令打印每个文件及其大小,然后通过管道传输到sort

stat -f '%z %N' /home/username/*.txt | sort -nr

如果您不想在输出中包括大小,则可以通过管道传输到cut

... | cut -d' ' -f2-

答案 1 :(得分:1)

您可以写:

ls -1 -S /home/username/*.txt

其中-1标志告诉ls每行打印一个文件,而-S标志告诉它按大小(从最大到最小)对文件排序。

此代码与您的代码之间有一些细微的差异(例如,这不会列出名称以.开头的文件),但是我想这些差异与您所关心的无关。 (如果它们是 ,请详细说明您的要求。)

答案 2 :(得分:1)

find /home/username/ -name '*.txt' -maxdepth 1 -type f -printf "%s\t%p\n" |
sort -r -n -k1 |
cut -f2- |
while IFS= read -r file; do
   echo "$file"
done
  • 打印每个文件的大小和文件名
  • 第一列的
  • 数字排序,即。大小
  • 删除带有剪切的第一列
  • 将每一行读入$line变量
  • echo "$line"