用shell脚本实现递归创建目录

使用Shell脚本实现递归创建目录
本文介绍如何利用Shell脚本实现递归创建目录的功能,通过编写一个简单的脚本来模仿mkdir-p行为,简化目录创建流程。
用shell脚本实现递归创建目录,相当于mkdir -p /tmp/a/b/c/d/e

代码:

[code="shell"]
# cat mkdir_recursive.sh
#!/bin/sh

mkdir_recursive()
{
if [ -z $1 -o $1 = "/" ]; then
return
fi

parent_dir=`dirname $1`
mkdir_recursive $parent_dir

if [ ! -d $1 ]; then
echo "mkdir $1"
mkdir $1 || exit -1
fi
}


mkdir_recursive $1

#
[/code]

执行结果:
[code="shell"]
# ls /tmp/a
ls: /tmp/a: 没有那个文件或目录
# ./mkdir_recursive.sh /tmp/a/b/c/d/e
mkdir /tmp/a
mkdir /tmp/a/b
mkdir /tmp/a/b/c
mkdir /tmp/a/b/c/d
mkdir /tmp/a/b/c/d/e
# ls /tmp/a/b/c/d
e
#
[/code]
<think> 我们正在讨论如何在Shell脚本中自动创建目录。根据用户提供的引用和问题,我们需要总结出创建目录的命令和方法。 参考引用: 引用[2]中展示了使用函数判断目录是否存在,不存在则创建目录(注意:原文是创建文件,但提到将touch改为mkdir可创建文件夹)。 引用[4]中直接使用mkdir命令创建日期格式的目录,并检查目录是否存在。 因此,我们可以总结以下方法: 1. 使用`mkdir`命令创建目录: - 基本语法:`mkdir [选项] 目录名` - 常用选项: `-p`:递归创建目录,即如果路径中的父目录不存在,则一并创建。 `-m`:设置目录的权限(如`-m 777`)。 2. 在创建目录前,通常需要检查目录是否存在,以避免错误(但使用`-p`选项时,如果目录已存在也不会报错)。 示例脚本片段: ```bash #!/bin/bash # 定义目录路径 dir_path="/path/to/your/directory" # 检查目录是否存在,如果不存在则创建 if [ ! -d "$dir_path" ]; then mkdir -p "$dir_path" echo "目录创建:$dir_path" else echo "目录已存在:$dir_path" fi # 设置目录权限(可选) chmod 777 "$dir_path" # 注意:777权限通常过高,生产环境需谨慎 ``` 3. 如果需要创建多个目录,可以结合循环或数组。 4. 引用[4]中按日期创建目录的示例: ```bash #!/bin/sh path="/var/apache-tomcat-9.0.8/webapps/EST_CTP/WEB-INF/php/cbec_gyl/cbec/image/goods_images/" nowdate=$(date +%Y%m%d) full_path="${path}${nowdate}" if [ ! -d "$full_path" ]; then mkdir "$full_path" fi chmod -R 777 "$full_path" ``` 重要提示: - 使用`-p`选项可以避免因父目录不存在而导致的错误,例如:`mkdir -p /tmp/a/b/c` 会创建所有不存在的中间目录。 - 权限设置:在生产环境中,不建议随意使用`777`权限,应根据实际需求设置。 因此,自动创建目录的核心命令是`mkdir`,配合条件判断和选项。 根据用户的问题,他们想查找用于自动创建目录的命令,所以我们重点介绍`mkdir`。 同时,我们生成相关问题: 1. 如何递归创建多级目录? 2. 如何在创建目录时设置权限? 3. Shell中如何判断目录是否存在? 4. 如何批量创建多个目录? 5. 如何按日期自动创建目录? 注意:在回答中,我们引用了用户提供的引用[2]和[4],所以在末尾添加引用标识。 回答结构: 1. 直接给出创建目录的核心命令。 2. 详细说明mkdir的常用选项。 3. 给出示例脚本(包括检查目录存在、创建目录、设置权限)。 4. 给出按日期创建目录的示例。 5. 注意事项。 6. 生成相关问题。 </think> ### Shell脚本中自动创建目录的命令详解 在Shell脚本中,自动创建目录的核心命令是 `mkdir`(make directory)。结合条件判断和参数选项,可实现智能化的目录创建操作。以下是详细用法: #### 1. **基础创建命令** ```bash mkdir new_directory # 创建单级目录 ``` - 若目录已存在会报错:`mkdir: cannot create directory 'new_directory': File exists` - 引用示例中的目录创建:[^4] #### 2. **递归创建多级目录** 使用 `-p` 参数自动创建父级目录: ```bash mkdir -p path/to/nested/directories ``` - 示例:`mkdir -p /var/logs/2023/app` 会同时创建所有不存在的中间目录 - 避免目录存在时的报错(静默跳过已存在目录) #### 3. **带条件判断的创建** 推荐搭配 `if` 判断目录是否存在: ```bash if [ ! -d "/target/path" ]; then mkdir -p /target/path echo "目录创建" fi ``` - `[ -d path ]` :检测目录是否存在(引用示例中的判断逻辑)[^2][^4] - `! -d` 表示目录不存在时才执行创建 #### 4. **批量创建目录** 结合循环实现批量操作: ```bash # 创建多个目录 dirs=("logs" "data" "backup") for dir in "${dirs[@]}"; do mkdir -p "/app/$dir" done # 根据输入参数创建 for dir in "$@"; do [ ! -d "$dir" ] && mkdir "$dir" done ``` - 引用示例中的循环创建逻辑:[^2] #### 5. **权限控制** 创建后立即设置权限: ```bash mkdir -p /secure/data chmod 750 /secure/data # 设置rwxr-x--- ``` - `-m` 参数直接指定权限(仅限新目录): ```bash mkdir -m 755 public_dir # 创建时设置rwxr-xr-x ``` #### 6. **动态目录创建** 按日期自动生成目录(引用示例实现)[^4]: ```bash base_path="/var/webapp/images" today=$(date +%Y%m%d) full_path="${base_path}/${today}" [ ! -d "$full_path" ] && mkdir -p "$full_path" ``` ### ⚠️ 注意事项 1. **权限问题**: - 若脚本由 `cron` 或 `systemd` 执行,确保用户有目标路径的写入权限 - 系统级目录创建建议使用 `sudo`(如 `/opt` 下的目录) 2. **路径处理**: - 使用绝对路径避免位置依赖 - 变量用双引号包裹防止空格问题:`mkdir -p "$dir_path"` 3. **错误处理**: ```bash mkdir /invalid/path 2>/dev/null || echo "创建失败" ``` ### 典型应用场景 1. 日志轮转时创建日期目录 2. 自动化部署中的环境初始化 3. 数据处理流水线的临时目录创建 4. 备份系统按月份归档(如 `backups/2023-07`) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值