複数のディレクトリの最大のファイルで構成される圧縮アーカイブを作成するには?

複数のディレクトリの最大のファイルで構成される圧縮アーカイブを作成するには?

特定のしきい値を超える複数のディレクトリの最大ファイルを含む圧縮アーカイブを生成するスクリプトを作成したいと思います。たとえば、2 MB より大きい 5 つのファイルをインポートして、largestfile.tar.gzこれまで持っているファイルに入れる方法を知りたいと思います。

du -a $path | sort -n -r | head -n 5 > diskspacefile.txt
file=$(cat diskspacefile.txt)
while read p; do
    filesize=echo $p | awk '{print $1 }'
    if [ $filesize > 2000000 ] 
    then
        zipfile=`echo $p | awk '{print $2 }'`
        tar -zcvf largestfile.tar.gz $zipfile
    fi
done

残念ながら、これはうまくいかないようです。実行すると、アーカイブにファイルが1つだけ表示されたり、ファイルがまったく表示されません。文脈上、私が関心を持つディレクトリは、および(つまり、コードスニペットの変数値に/rootなります)です。/bootpath

ベストアンサー1

まず、これを使用して、find特定のディレクトリに2MBを超えるすべてのファイルのリストを生成できます。

find . -type f -size +2M

このリストから最大5つのファイルを抽出しようとしています。これを行うには、-printf次のようにファイルパスとファイルサイズをバイト単位で印刷するオプションを使用できます。

find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n'

これで、これらの結果をファイルサイズ(降順)で並べ替えることができ、順序付きリストの最初の5つの結果を並べ替えることができます。

find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n' | sort -rnk1

次に、ファイルサイズを削除して、現在のディレクトリから2M以上の最大5つのファイルの相対パスを取得します。

find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n' | sort -rnk1 | head -n 5 | cut -d: -f2-

tar最後に、これらのファイルの圧縮アーカイブを作成するために、このファイルパスのリストをコマンドに渡すことができます。

tar czf largestfile.tar -T <(find . -maxdepth 1 -type f -size +2M -printf '%s:%P\n' | sort -rnk1 | head -n 5 | cut -d: -f2-)

おすすめ記事