命令行通配符

这是因为 shell 中的通配符(*)展开行为不同:

  1. unzip *.zip
  • shell 会先展开 *.zip,如果当前目录有多个 zip 文件
  • 命令会变成 unzip file1.zip file2.zip file3.zip
  • 这可能导致 unzip 命令收到多个参数而报错
  1. unzip "*.zip"
  • 引号阻止了 shell 展开通配符
  • 通配符会直接传递给 unzip 命令
  • unzip 命令自己处理通配符匹配

正确的写法有几种:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 方法1:使用引号
unzip "*.zip"

# 方法2:使用转义
unzip \*.zip

# 方法3:使用循环处理多个文件
for zip in *.zip; do
unzip "$zip"
done

# 方法4:使用find命令
find . -name "*.zip" -exec unzip {} \;

如果需要更健壮的处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

# 解压所有zip文件
unzip_all() {
local zip_files=( *.zip )

# 检查是否存在zip文件
if [ ! -e "${zip_files[0]}" ]; then
echo "没有找到zip文件"
return 1
}

# 逐个解压
for zip in "${zip_files[@]}"; do
echo "解压: $zip"
if ! unzip "$zip"; then
echo "解压失败: $zip"
return 1
fi
done
}