特定のしきい値を超える複数のディレクトリの最大ファイルを含む圧縮アーカイブを生成するスクリプトを作成したいと思います。たとえば、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
なります)です。/boot
path
答え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-)