アーカイブに最大1000個のファイルを含む複数のディレクトリを圧縮します。

アーカイブに最大1000個のファイルを含む複数のディレクトリを圧縮します。

午前中に試してもまだわかりません。おそらくあなたも知っているでしょう。

多くのディレクトリをzipファイルに圧縮して、各ディレクトリが独自のzipファイルになるようにしたいと思います。フォルダに1000個を超えるファイルがある場合は、それぞれ1000個のファイルで構成される複数のzipファイルに分割します。

アーカイブ時に最大ファイル数を設定し、それに応じて分割することは可能ですか?各ファイルを独立して使用できるように、多くのファイルを管理可能な塊に圧縮しようとしています。

私が今持っている解決策は次のとおりです。

# make each folder into its own archive
for i in */; do zip -r "${i%/}.zip" "$i"; done

# make archives of 500 files per piece
find . ! -name '*.zip' -type f | xargs -n 500 | awk '{system("zip myarch"NR".zip "$0)}'

源泉:ファイル数が制限されたZipアーカイブそして複数のディレクトリを別々のzipファイルに圧縮するコマンド

私が見逃しているのは、findのファイルをそのファイルが見つかったサブディレクトリに制限する方法です。 500個のファイルがある場合は、この500個のファイルのみをディレクトリに配置する必要があります。 2400個のファイルがある場合は、3個のファイルに分割する必要があります。ファイルはわずか400個です。

私はこの文脈で何かがうまくいくはずだと思います。しかし、まだ何かが間違っています。

#for all subfolders, find all files, take them in 500 name chunks, and zip them up into numbered archives.
for i in */; do find "${i%/}" -type f | xargs -n 500| awk '{system("zip ${i%/}"NR".zip "$0)}'; done

助けてくれてありがとう。ありがとうございます!

直す。このbashスクリプトはうまくいくはずですが、なぜzipファイルがまだacroなのか理解できません。

#!/bin/bash

for i in */; do 
    printf $i
    find "${i%/}" -type f | xargs -n 500 | awk '{system("zip marych${i%/}"NR".zip "$0)}'; 

アップデート2:

修理する。いくつかの引用問題が問題です。

for i in */; do find "${i%/}" -type f| xargs -n 500 | awk '{system("zip '${i%/}'"NR".zip "$0)}'; done

done

ベストアンサー1

著作権ジェームズ・ダニエル・マス・リッチ(James Daniel Mars Rich)。この資料はアーカイブに最大1000個のファイルを含む複数のディレクトリを圧縮します。'、しかし'でも得ることができます。https://snippetly.blogspot.com/2019/12/zip-files-recursively-from-directories.html' 次のライセンスの条件に従います: Comprehensive Open License 3.0(https://jamesdanielmarrsritchey.blogspot.com/2019/06/compressive-open-license-30.html)、MIT(https://opensource.org/licenses/MIT)。

PHPを使用してzipファイルを作成できます。ここで、各zipファイルにはフォルダごとに指定された数のファイルが含まれています。まず、処理する必要があるすべてのディレクトリを含む配列を取得します。次に、各ディレクトリを繰り返してファイル配列を作成します。次に、各配列値にXファイルを含むこれらのファイルの新しい配列を作成します。その後、7zipを使用して配列を繰り返し、7zipがこれらすべてのファイルを圧縮できるように値を渡します。

以下のコードはzipごとに5つのファイルを設定します。お好みの番号に変更できます。 p7zip、find、php7をインストールする必要があります。

パスワード:

<?php

$top_directory = '/home/user1/files_to_zip';

$destination = '/home/user1/zips';

#Get a list of folders, including the top directory

$dirs = shell_exec("find $top_directory -type d");

#Deal with each directory separately

$dirs = explode("\n", $dirs);

$dirs = array_filter($dirs);

foreach ($dirs as $dir){

    $zip_name = basename($dir);

    #Get a list of files within one directory

    $files = shell_exec("find $dir -maxdepth 1 -type f");

    #Split list of files for one directory into array

    $files = explode("\n", $files);

    $files = array_filter($files);

    if (empty($files) === TRUE){

        goto end;   

    }

    #Create a new array which holds 5 files per value (each value should be formatted as expected by the ZIP utility for a list of files)

    $n = 0;

    $list = array('');

    foreach ($files as $file){

        $n++;

        if ($n <= 5){

            $keys = array_keys($list);

            $key = end($keys);

            $list[$key] = $list[$key] . " " . $file;

        } else {

            $n = 1;

            $list[] = '';

            $keys = array_keys($list);

            $key = end($keys);

            $list[$key] = $list[$key] . " " . $file;

        }

    }

    #Create the zip archives of files for the one directory

    $n = 0;

    foreach ($list as $value){

        $n++;

        $zip_name_2 = "{$zip_name}_{$n}.zip";

        shell_exec("cd $destination && 7z a $zip_name_2 $value");

    }

    end:

}

?>

おすすめ記事