次のスクリプトは、二つ以上の引数を取ります。最初は、使用する一連のファイルの合計サイズ です。残りの引数はfindに渡され、 は引数としてディレクトリを与えることができます。このスクリプトでは、ファイル名 が「正常に動作している」とみなし、空白、改行、またはシェルを混乱させるようなものである が含まれないことを前提としています。
スクリプトは、指定されたサイズに収まる最大のファイルを出力します。この は、必ずしも最もスペースを消費するファイルセットではありませんが、一般的なケースで を効率的に見つけることはナップザックの問題です。 解決する可能性は低いです。
をsort -n
に変更して、最小の ファイルから開始することができます。
#!/bin/sh
avail=$1
shift
used=0
find "[email protected]" -type f -print | xargs wc -c | sort -rn | while read size fn; do
if expr $used + $size '>' $avail >/dev/null; then
continue;
fi
used=$(expr $used + $size)
echo $fn
done
スクリプトの出力は、実際のアーカイブを作成するためにpax(1)に渡すことができます。 たとえば、(スクリプトfitfiles
を呼び出したと仮定した場合)
sh fitfiles 10000000 *.txt | pax -w -x ustar -v | xz > wdb.tar.xz