本文章仅供了解什么是脚本,一个简单的示例,知道大概的执行流程
脚本需求
给某个文件夹中的每一个文件夹都压缩成zip文件,同时命名按照文件夹的最后一个‘_’的数字来命名,将压缩好的文件全放入指定的文件夹下。
脚本代码
#!/bin/bash
# 定义源目录和目标目录
SOURCE_DIR="/path/to/source_directory" # 修改为实际的源目录路径
DEST_DIR="/path/to/destination_directory" # 修改为实际的目标目录路径
# 确保目标目录存在
mkdir -p "$DEST_DIR"
# 遍历源目录中的每个子文件夹
for dir in "$SOURCE_DIR"/*/; do
# 获取文件夹名称(不包括路径)
folder_name=$(basename "$dir")
# 获取文件夹名称最后一个 '_' 后面的数字
number=$(echo "$folder_name" | awk -F'_' '{print $NF}')
# 定义压缩文件的目标路径和名称
zip_name="$DEST_DIR/$number.zip"
# 压缩文件夹并命名为数字.zip
zip -r "$zip_name" "$dir"
echo "已压缩 $folder_name 为 $zip_name"
done
echo "所有文件夹均已压缩完毕并保存至 $DEST_DIR。"
详细解释
-
#!/bin/bash
:- 这是Shebang,用来指定解释器。这一行告诉系统,这个脚本应该用
/bin/bash
来执行,即使用 Bash 解释器。
- 这是Shebang,用来指定解释器。这一行告诉系统,这个脚本应该用
-
SOURCE_DIR="/path/to/source_directory"
和DEST_DIR="/path/to/destination_directory"
:- 这里定义了两个变量,
SOURCE_DIR
和DEST_DIR
,分别代表源目录和目标目录。 - 变量: 在 Bash 脚本中,变量通常用大写字母命名。变量的值是用等号
=
来赋予的,等号两侧不能有空格。 - 双引号
"
: 用来包裹变量的值,以确保变量值中的特殊字符(如空格)不会被解释器误解。
- 这里定义了两个变量,
-
mkdir -p "$DEST_DIR"
:- 这个命令用于创建目标目录
DEST_DIR
。 mkdir
: 创建目录的命令。-p
: 如果目标目录不存在,-p
参数会创建该目录及其父目录。如果目录已存在,不会报错。$DEST_DIR
: 使用$
符号来引用变量的值。$DEST_DIR
表示我们在脚本前面定义的目标目录路径。
- 这个命令用于创建目标目录
-
for dir in "$SOURCE_DIR"/*/; do
:- 这是一个
for
循环,用于遍历源目录中的每个子文件夹。 for ... in ...; do ... done
:for
循环的结构。它遍历指定的列表,对每个项目执行do
和done
之间的命令。"$SOURCE_DIR"/*/
: 这个模式匹配路径中的所有子文件夹。*
是通配符,匹配所有内容。/
在结尾表示只匹配目录。dir
: 每次循环时,dir
都会被赋值为当前匹配到的子文件夹路径。
- 这是一个
-
folder_name=$(basename "$dir")
:- 获取当前子文件夹的名称(不包括路径)。
basename
: 这个命令从给定的路径中提取最后一部分,即文件或目录名。$(...)
: 命令替换,将命令的输出赋值给变量。这里是将basename "$dir"
的输出赋值给folder_name
。
-
number=$(echo "$folder_name" | awk -F'_' '{print $NF}')
:- 从
folder_name
中提取最后一个'_'
后的部分。 echo "$folder_name"
: 输出folder_name
的值。|
: 管道符,用于将前一个命令的输出作为下一个命令的输入。awk -F'_' '{print $NF}'
:awk
是一个强大的文本处理工具。-F'_'
: 指定awk
的字段分隔符为'_'
。{print $NF}
:NF
是awk
中的一个内置变量,表示字段的总数。$NF
表示最后一个字段。因此,这个命令会输出最后一个'_'
后面的部分。
- 从
-
zip_name="$DEST_DIR/$number.zip"
:- 定义压缩文件的目标路径和名称。
"$DEST_DIR/$number.zip"
: 将number
变量的值与目标目录路径拼接起来,作为压缩文件的名称。
-
zip -r "$zip_name" "$dir"
:- 将当前子文件夹压缩为
.zip
文件。 zip
: 压缩文件的命令。-r
: 递归地压缩目录及其所有子目录和文件。"$zip_name"
: 压缩后的.zip
文件的路径和名称。"$dir"
: 要压缩的子文件夹路径。
- 将当前子文件夹压缩为
-
echo "已压缩 $folder_name 为 $zip_name"
:- 输出一条消息,表示当前子文件夹已被压缩。
echo
: 输出命令,用于显示消息。"..."
: 双引号中的内容会被原样输出,其中的变量会被替换为它们的值。
-
done
:- 结束
for
循环。
- 结束
-
echo "所有文件夹均已压缩完毕并保存至 $DEST_DIR。"
:- 脚本执行完成后,输出最终的状态消息。
符号解释
$
: 用于引用变量的值。"
: 双引号用于包裹字符串,保护字符串中的空格和特殊字符。`...`
或$(...)
: 命令替换,运行其中的命令并返回其输出。|
: 管道符,将一个命令的输出作为下一个命令的输入。*
: 通配符,匹配任意数量的字符。
使用方法
-
创建脚本文件:
nano compression_script.sh
-
将上述内容复制并粘贴到脚本文件中。
-
保存并退出编辑器(按
Ctrl+X
,然后按Y
确认保存)。 -
为脚本文件添加可执行权限:
chmod +x compression_script.sh
-
运行脚本:
./compression_script.sh
注意事项
- 将
archive_name.tar.gz
和archive_name.zip
替换为你想要的文件名。 - 将
/path/to/directory
替换为你要压缩或解压的实际目录路径。 tar.gz
更适合在 Linux 和 macOS 系统中使用,而zip
则更为通用,支持在 Windows 系统中使用。