所以我有一些文件夹
|-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命令...
答案 0 :(得分:1)
首先,尝试压缩已经压缩的格式(如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 {} +
--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”答案 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移动到根目录!
感谢大家的帮助!