2017-02-09 8 views
-5

ディレクトリ内で、指定された合計サイズを持つ最大ファイルを選択し、別のディレクトリに移動したい。選択のためにファイルをリストしている間、それらを名前でソートする必要があります。bash:合計サイズ制限を持つ最大ファイルを選択するための1つのライナー

例として、合計サイズが500MBで、各ファイルサイズが500MB未満であるとしましょう。

使用CASE1:

  • a.bz2の200メガバイト
  • b.bz2 100メガバイト
  • c.bz2の300メガバイト
  • d.bz2の400メガバイト

    移動a.bz2とb.bz2(合計= 300MB)をディレクトリ../selected(3番目のファイルを選択すると合計サイズが500MBを超えるため)

ユースケース2:

  • a.bz2の200メガバイト
  • b.bz2 200メガバイト
  • c.bz2の100メガバイト
  • d.bz2の400メガバイト

    移動。 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

パイプ(|)を使用することは絶対に1つのライナーです –

+0

re:提案された編集、私はmp3部分を削除しました、そしてafaik、 'find'はすでにアルファベット順に結果を出力します。 – webb

関連する問題