试了一上午,还是没搞明白。也许你知道。
我想将许多目录压缩成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/