迭代具有相同前缀的子目录和zip文件,并在压缩后删除原始文件

迭代具有相同前缀的子目录和zip文件,并在压缩后删除原始文件

我有当前的代码:

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

相关内容