每个子目录变压缩包

18 阅读1分钟

脚本

#!/bin/bash

# 目标目录
target_dir="/opt/migrates"

# 如果目标目录不存在,则创建它
if [ ! -d "$target_dir" ]; then
    mkdir -p "$target_dir"
fi

# 遍历当前目录下的每一个子目录
for dir in */; do
    # 去掉目录名后面的斜杠
    dir_name="${dir%/}"
    
    # 将目录打包成压缩包,压缩包名字与文件夹名字同名,并保存到目标目录
    tar -czvf "${target_dir}/${dir_name}.tar.gz" "$dir_name"
done

最短路径匹配

${dir%/} 是在Bash(一种常见的Unix/Linux shell)脚本中使用的参数扩展语法,下面详细解释其含义和用法。

基本含义

${dir%/} 用于从变量 dir 的值的右侧删除最短匹配的模式。在这个特定的例子中,模式是 /,也就是从变量 dir 的值的末尾删除一个斜杠(/)字符。

语法解释

  • ${variable%pattern}:这是一种参数扩展的形式,其中 variable 是要处理的变量名,pattern 是要匹配并删除的模式。% 表示进行最短匹配删除,也就是说,它会从变量值的右侧开始,删除第一个匹配到的模式。

示例代码

以下是一个简单的Bash脚本示例,展示了 ${dir%/} 的用法:

#!/bin/bash

# 定义一个包含斜杠结尾的目录路径变量
dir="/home/user/documents/"

# 使用 ${dir%/} 去除末尾的斜杠
new_dir="${dir%/}"

# 输出原始目录路径和处理后的目录路径
echo "原始目录路径: $dir"
echo "处理后的目录路径: $new_dir"

代码解释

  1. 定义变量dir="/home/user/documents/" 定义了一个包含斜杠结尾的目录路径变量。
  2. 参数扩展new_dir="${dir%/}" 使用 ${dir%/} 从变量 dir 的末尾删除一个斜杠字符,并将结果赋值给新变量 new_dir
  3. 输出结果:使用 echo 命令输出原始目录路径和处理后的目录路径。

运行结果

运行上述脚本,输出结果如下:

原始目录路径: /home/user/documents/
处理后的目录路径: /home/user/documents

可以看到,处理后的目录路径末尾的斜杠已经被删除。

注意事项

  • 如果变量 dir 的值末尾没有斜杠,那么 ${dir%/} 不会对其进行任何修改,直接返回原始值。
  • 如果要删除最长匹配的模式,可以使用 ${variable%%pattern} 语法。例如,${dir%%/*} 会从变量 dir 的右侧开始,删除最长匹配的以 / 开头的字符串。