2017-02-09 102 views
-5

在一个目录中,我想选择具有给定总大小的最大文件并将它们移动到不同的目录。在列出要选择的文件时,我们需要按名称对它们进行排序。bash:用于选择总大小限制的最大文件的1个衬垫

作为一个例子,说清楚,让我们说总大小是500MB,每个文件大小小于500MB。

使用案例1:

  • a.bz2 200MB
  • b.bz2 100MB
  • c.bz2 300MB
  • d.bz2 400MB

    移动a.bz2和b.bz2(total = 300MB)到目录../selected(因为选择第三个文件会使总大小> 500MB)

用例2:

  • a.bz2 200MB
  • b.bz2 200MB
  • c.bz2 100MB
  • d.bz2 400MB

    移动。 bz2,b.bz2和c.bz2(总数= 500MB)到目录../selected

我知道如何添加每个文件的大小,但像在C程序中打破循环需要我编写脚本。 (|)相反,我用管道希望它在1个衬垫

+0

他们是如何排序?文件的大小是否一直在增加?你是否想要适应最大数量的文件?这似乎有一半... – dawg

回答

2

不知道这是否有资格作为一个班轮,但...

find . -type f -print0 | xargs -r -0 du -k | 
    awk '{sum+=$1; if(sum>500000){exit}; print}' | cut -f2- | tr '\n' '\0' | 
    xargs -r -0 mv -t ../selected 
+1

使用管道(|)绝对是一个班轮 –

+0

重新:建议编辑,我已经删除了mp3部分,并且,afaik,'find'将按字母顺序提供结果。 – webb