在所有目录和子文件夹中提取zip文件,但不包括文件夹本身。

我需要递归地将目录路径及其子文件夹中的各个文件本身进行压缩,而不是压缩文件夹或目录。我还需要排除某些文件类型(多个)。在Linux中,我该如何使用ZIP实现这一点?
这是修改后的脚本(感谢Ravexina)。
#!/bin/bash
echo "hello world"
dir=/home/fjaffer/temp
#cd "${dir}"
#cd $(echo $dir | tr -d '\r')
cd "$dir"
find -not -iname '*.txt' -type f | while read -r file_name; \
do zip "$(dir "$file_name")".zip "$file_name" ; done

输出: 第8行找不到zip命令。

你想要一个包含特定根目录下所有文件的.zip文件,还是多个*.gz文件(每个文件一个)?// 当不同目录中的两个文件具有相同的名称时,应该怎么处理? - PerlDuck
不,我需要每个目录或子文件夹中的文件都有一个zip文件,但不要压缩目录和子文件夹。 - Femina Jaffer
谢谢你,Ravexina。如果这个问题很愚蠢的话,我很抱歉,你能否解释一下在示例中"realpath"或"$file_name"是什么意思。我尝试了这个语法,但出现了"line 8 zip not found"的错误。我会编辑我的原始问题并将脚本放在那里。 - Femina Jaffer
@FeminaJaffer 看起来你没有安装 zip,请使用以下命令进行安装:sudo apt install zip - Ravexina
1个回答

你可以用类似这样的方式来做:
find -not -iname '*.mp3' -type f | while read -r file_name; \
do zip "$(realpath "$file_name")".zip "$file_name" ; done

它将分别压缩目录中除了"mp3"文件以外的所有文件。
你还可以排除其他类型的文件,例如zip和mp3文件。
find -not -iname '*.mp3' -not -iname '*.zip' -type f

所以这个结构:
.
└── a
    ├── 1
    │   └── 1.mp3
    └── 2
        ├── 1.jpg
        ├── 1.mp3
        └── 1.mpv

将变成:

.
└── a
    ├── 1
    │   └── 1.mp3
    └── 2
        ├── 1.jpg
        ├── 1.jpg.zip
        ├── 1.mp3
        ├── 1.mpv
        └── 1.mpv.zip

非常感谢,我会尝试一下。如果是所有文件,那么文件名可以使用通配符选项,比如*.*,对吗?我该如何添加一个计数器呢...比如说,我想要每次处理10个目录/子文件夹中的总目录数和zip文件数? - Femina Jaffer
这个脚本并不太聪明,你可以用for循环替换while,或者像你自己说的那样加一个计数器,在达到某个数字后跳出while循环。看一下这个链接:https://stackoverflow.com/questions/13638670/adding-counter-in-shell-script - Ravexina
1@FeminaJaffer 如果你认为这个答案对你有帮助,你也可以点击灰色的勾选来接受它。 - Ravexina