ディレクトリ内にファイルが多すぎます。
そのディレクトリの最初の5000ファイルを圧縮してfile.tar.gz
、次に5001 - 10000...と圧縮したい。
どうやってするの?
答え1
ls を使用して名前のリストを生成し、head と tail を使用してそれらをフィルタリングします。ループでこれを実行するワンライナーを次に示します。ディレクトリ内のファイル数を知っておく必要があります (ls | wc -l でわかります)。
for ii in $(seq -w 5000 5000 NUMBER_OF_FILES) ; do echo $ii ; ls | head -n $ii | tail -n 5000 | tar -f ../ARCHIVE_FILE_$ii.tar.gz -czv -T - ; done
大文字の部分を、必要なものに置き換えます。
答え2
このスクリプトは、すべてのファイルをアーカイブに徐々に追加し、アーカイブに番号を付けます。ARCHIVE_NAME の名前を「5000」に変更します。
$ COUNT_MOD=0; for i in *; do tar -r -f ARCHIVE_NAME`expr $COUNT_MOD / 5000`.tar $i; ((COUNT_MOD++)) ; done
このスクリプトは最適化されていないため、いくつかのルールがあります。
- このスクリプトを開始するときに ARCHIVE_NAME# が存在してはいけません。何かが失敗した場合は、「rm ARCHIVE_NAME*」を実行してください。
- ディレクトリ エントリはスクリプトによって 1 つのエントリとして扱われますが、'tar' ではそうではありません。Tar はディレクトリに入り、すべてのファイルを再帰的に追加するため、アーカイブには 5000 を超えるファイルが含まれる可能性があります。
- 圧縮されたアーカイブは更新できません。'-z' を省略しました。申し訳ありません :-)
答え3
5000 個のファイル名をリストするファイル セットを作成し、tar の -T 引数とともに使用することができます。次のようなものが機能する可能性があります。
ls -1 | split -l 5000 - tarlist
count=0
for f in tarlist*
do
tar -czf save.$count.tar.gz -T $f
count=`expr $count + 1`
done