如何压缩具有相同名称但不同扩展名的文件?

如何压缩具有相同名称但不同扩展名的文件?

我有一个很大的目录,其中包含这样的文件:

file1.txt
file1.meta
file1.csv
file2.txt
file2.meta
file2.csv
file2.abc

我想创建 zip 文件,例如:

file1.zip
file2.zip

我努力了

ls -1 ~/TEMP | sed 's/\.[a-z]*//g' | uniq | awk '{print $NF}' | xargs -i zip {}.zip ~/TEMP/{}.*

但这只是给出了一条错误消息,表明该文件无法提供资金。我猜问题出在通配符 * 上。

zip error: Nothing to do! (file1.zip)
    zip warning: name not matched: /home/user/TEMP/file.*

答案1

分拆来自杰夫的想法,但不使用列表:

for fname in *.*; do
    prefix=${fname%.*}
    [ ! -f "$fname" ] || [ -f "$prefix.zip" ] && continue
    zip "$prefix" "$prefix".*
done

此循环遍历当前目录中至少包含一个点字符的所有名称。

循环体通过删除当前文件名中最后一个点后面的位来提取文件名前缀(使用%%in 代替%第一的点)。然后,它测试该名称是否实际上是常规文件的名称(或该文件的符号链接)以及该文件对应的 Zip 存档是否已存在。

如果该文件是常规文件(或一个符号链接),并且归档文件不存在,zip则调用该文件来创建归档文件。

答案2

一种方式,在 bash 中(因为你标记了它):

  1. 将文件名前缀列表收集到关联数组中:

    declare -A prefixes
    for f in *; do prefixes[${f%%.*}]=1; done
    
  2. 循环遍历前缀并创建 zip 文件:

    for p in "${!prefixes[@]}"; do zip "$p" "$p".*; done
    

相关内容