我有一个很大的目录,其中包含这样的文件:
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 中(因为你标记了它):
将文件名前缀列表收集到关联数组中:
declare -A prefixes for f in *; do prefixes[${f%%.*}]=1; done
循环遍历前缀并创建 zip 文件:
for p in "${!prefixes[@]}"; do zip "$p" "$p".*; done