shell输入每个文件夹和zip内容

时间:2013-05-07 19:10:37

标签: shell

所以我有一些文件夹

|-Folder1
||-SubFolder1
||-SubFolder2
|-Folder2
||-SubFolder3
||-SubFolder4

每个子文件夹包含几个我要压缩到根文件夹的jpg ... 我有点卡在“如何输入每个文件夹”

这是我的代码:

find ./ -type f -name '*.jpg' | while IFS= read i 
do
   foldName=${PWD##*/}
    zip ../../foldName *
done

更好的方法是存储FolderName + SubFolderName并将其作为名称提供给zip命令...

4 个答案:

答案 0 :(得分:1)

压缩JPEG(用于压缩)通常是浪费的努力

首先,尝试压缩已经压缩的格式(如JPEG文件)通常是浪费时间,有时会导致存档大于原始文件。但是,为了方便在一个包中包含大量文件,有时这样做很有用。

要记住一些事情。 YMMV。

使用查找的-execdir标记

您需要的是 find 实用程序的-execdir标志。 GNU查找手册页说:

   -execdir command {} +
          Like -exec, but the specified command is run from the  subdirec‐
          tory  containing  the  matched  file,  which is not normally the
          directory in which you started find.

例如,给定以下测试语料库:

cd /tmp
mkdir -p foo/bar/baz
touch foo/bar/1.jpg
touch foo/bar/baz/2.jpg

您可以使用find压缩整个文件集,同时通过单个调用排除路径信息。例如:

find /tmp/foo -name \*jpg -execdir zip /tmp/my.zip {} +

使用Zip的--junk-paths标志

许多系统上的zip实用程序支持--junk-paths标志。 zip 的手册页说:

  --junk-paths
          Store just the name of a saved file (junk the path), and do  not
          store  directory names.

因此,如果您的find实用程序不支持-execdir,但您执行有一个支持junking路径的zip,那么您可以这样做:

find /tmp/foo -name \*jpg -print0 | xargs -0 zip --junk-paths /tmp/my.zip

答案 1 :(得分:0)

您可以使用dirname获取其所在文件/目录的目录名称。 您还可以使用find简化-type d命令以仅搜索目录。然后你应该使用basename来获得子目录的名称:

find ./*/* -type d | while read line; do
  zip  --junk-paths "$(basename $line)" $line/*.jpg
done 

<强>解释

  • find ./*/* -type d 将打印出./*/*中的所有目录,这些目录将导致当前目录中所有目录的子目录
  • while read line从流中读取每一行并将其存储在变量“line”中。因此$ line将是子目录的相对路径,例如“Folder1中/ Subdir2”
  • "$(basename $line)"仅返回子目录的名称,例如“Subdir2”
  • 更新:如果您不希望将直接路径存储在zip filde中,请将zip命令添加--junk-paths

答案 2 :(得分:0)

所以稍微检查一下,我终于有了一些工作:

find ./*/* -type d | while read line; do
  #printf '%s\n' "$line"
  zip ./"$line" "$line"/*.jpg
done

但是这创建了包含以下内容的存档:

Subfolder.zip
Folder
|-Subfolder
||-File1.jpg
||-File2.jpg
||-File3.jpg

相反,我喜欢折叠:

Subfolder.zip
|-File1.jpg
|-File2.jpg
|-File3.jpg

所以我尝试在不同的组合中使用basename和dirname ...总是有一些错误...... 并且只是为了学习如何:如果我希望在与“Folder”相同的根目录中创建新存档,该怎么办?

答案 3 :(得分:0)

好吧终于明白了!

find ./* -name \*.zip -type f -print0 | xargs -0 rm -rf

find ./*/* -type d | while read line; do
  #printf '%s\n' "$line"
  zip --junk-paths ./"$line" "$line"/*.jpg
done

find . -name \*.zip -type f -mindepth 2 -exec mv -- '{}' . \;

在第一行中,我只删除所有.zip文件,

然后我拉链所有,在最后一行我将所有zip移动到根目录!

感谢大家的帮助!