压缩多个目录,存档中最多包含 1000 个文件

压缩多个目录,存档中最多包含 1000 个文件

试了一上午,还是没搞明白。也许你知道。

我想将许多目录压缩成zip文件,这样每个目录都是它自己的zip文件。如果该文件夹中的文件超过 1000 个,则将它们分成多个 zip 文件,每个文件 1000 个文件。

归档时,是否可以设置最大文件数并相应地分割它们。我正在尝试将许多文件压缩成可管理的块,以便每个文件都可以独立使用。

我现在有的解决方案:

# 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个档案,前两个1000个文件一块,最后只有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

版权所有詹姆斯·丹尼尔·马尔斯·里奇。该材料是为提交于 '压缩多个目录,存档中最多包含 1000 个文件',但也可以从 ' 获得https://snippetly.blogspot.com/2019/12/zip-files-recursively-from-directories.html' 根据以下任何许可证的条款:可理解的开放许可证 3.0 (https://jamesdanielmarrsritchey.blogspot.com/2019/06/compressive-open-license-30.html),麻省理工学院(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:

}

?>

答案2

我为此使用 tar 。只要您有一个包含许多目录的文件夹,执行 tar -czvf filename.tar directory 会将所有文件夹压缩到一个 tar 文件中。

看:https://www.howtogeek.com/248780/how-to-compress-and-extract-files-using-the-tar-command-on-linux/

相关内容