我有当前的代码:
for fname in *.*; do
prefix=${fname%.*}
[ ! -f "$fname" ] || [ -f "$prefix.zip" ] && continue
zip "$prefix" "$prefix".*
done
这主要是我想要的,但我必须删除原始文件。是否可以进行修改以在压缩后删除原始文件?如果可能的话,如何在目录或其子目录上执行此操作?
当前文件结构如下:
-rootDir
|- Dir1
|- file1.jpg
|- file1.png
|- file1.mp3
|- Dir2
|- file2.jpg
|- file2.png
|- file2.mp3
我的目标是以下结构:
-rootDir
|- Dir1
|- file1.zip
|- Dir2
|- file2.zip
如前所述,上面的代码在单个目录中执行时工作正常。
我现在有300个子目录,如果我能获得上述代码的修改版本并在根目录级别执行,并整理剩余的文件,那对我会有很大的帮助。
答案1
zip
有一个--move
( -m
) 选项要求它将文件移动到存档中,IE将它们成功添加到存档后将其删除。建议-T
在实际删除文件之前将其与测试存档的选项配对:
zip -mT "$prefix" "$prefix".*
要处理多个目录,您可以循环它们:
for dir in */; do
(cd "$dir" && for fname in *.*; do
prefix="${fname%.*}"
[ ! -f "$fname" ] || [ -f "$prefix.zip" ] && continue
zip -mT "$prefix" "$prefix".*
done)
done