将所有文件压缩到一个档案中

将所有文件压缩到一个档案中

我想创建查找*.mp4并执行zip它的 bash 脚本。

我用的是这个:

#!/bin/sh
zip -r $(find . -name '*.mp4').zip $(find "/home/ehsan/Desktop" -name '*.pdf')

但不起作用并出现此错误:

zip error: Zip file structure invalid (./Bank_Mellat_v3.2_hassas-computer.com/Help.pdf)

答案1

将所有文件压缩到一个档案中

您可以使用以下命令将当前目录下找到的所有基本名称与 *.mp4 匹配的文件压缩到单个存档中:

zip my_mp4_archive.zip $(find . -name "*.mp4")

将每个文件压缩到其自己的存档中

以下脚本将单独压缩每个文件,并将其存储在与文件本身存储相同的目录中。

files=$(find . -name "*.mp4")

for f in $files; do
  echo "Compressing $f"
  (cd $(dirname $f) && zip $(basename $f.zip) $(basename $f))
done

答案2

zip仅此一项即可完成此操作。还请注意,zip压缩mp4文件效率低下,因为就空间而言它不会给您带来任何优势,因为它已经是压缩的 MPEG4 格式。

.mp4从当前目录开始递归查找所有文件并将其保存为files.zip

zip files.zip -r . -i '*.mp4'
  • -r表示递归运算

  • -i '*.mp4指定我们感兴趣的唯一模式

编辑 :

阅读完您的评论后,您似乎想要查找每个.mp4文件并仅创建zip该文件,并且还想对所有.mp4文件递归执行此操作。 如果是这样:

find . -type f -name '*.mp4' -exec bash -c 'zip "${1%.mp4}".zip "$1"' _ {} \;

这将从.mp4当前目录开始递归查找所有文件,并zip分别查找每个文件。因此foo.mp4zip-ped 为foo.zip。同样,您不会获得任何压缩优势。

答案3

使用它可以压缩.mp4基目录及其子目录中的所有文件。

$ zip test.zip `find . -name \*.mp4 -print | tr "\n" " "`

解释

压缩文件zip file-name.zip path1 path2...

要获取.mp4基目录及其所有子目录中具有扩展名的所有文件路径,请使用find

find . -name \*.mp4 -print

要将所有输出列在一行中,并以类似命令管道space中所需的方式分隔ziptr "\n" " "

把所有内容放在一起:

$ zip test.zip `find . -name \*.mp4 -print | tr "\n" " "`

更新 读完OP的评论后:

只需遍历所有找到的.mp4文件的路径名,例如:

for p in `find . -name \*.mp4 -print`                                                                                                           
do
    zip $p.zip $p
done

如果你的文件名包含空格字符,你可以trspacebackslash space

例如:使用$p | tr ' ' "\' '"而不是$p

相关内容