我想创建查找*.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.mp4
将zip
-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
中所需的方式分隔zip
tr "\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
如果你的文件名包含空格字符,你可以tr
用space
backslash space
例如:使用$p | tr ' ' "\' '"
而不是$p
。