在Linux中,创建文件时若目录不存在需先创建目录,常用方法有两种:一是组合mkdir -p与touch,如mkdir -p dir && touch dir/file,-p参数可避免目录重复创建报错;二是使用install -D命令,如install -D /dev/null dir/file,能直接递归创建目录并生成文件,技巧上,建议在脚本中优先用install -D简化操作,注意路径中含空格时需加引号,避免因权限问题导致创建失败。
在 Linux 系统管理或日常操作中,我们经常需要创建文件,但有时文件所在的目录可能并不存在,直接使用 touch 命令创建文件时,如果父目录缺失,会报错(touch: cannot touch '文件路径': No such file or directory),我们需要一种能“同时创建目录和文件”的方法,确保操作顺利完成,本文将介绍几种实用的 Linux 命令组合,帮助你在创建文件的同时自动创建所需的目录结构。
核心方法:mkdir -p + touch —— 最直观的组合
这是最基础也是最常用的方法,核心是通过 mkdir 命令的 -p(或 --parents)选项递归创建目录,再使用 touch 创建文件。
基本语法
mkdir -p "目录路径" && touch "目录路径/文件名"
mkdir -p:递归创建目录,如果目录已存在则不会报错(-p会忽略已存在的目录)。&&:逻辑与操作符,只有mkdir -p成功执行后,才会执行touch命令,确保“目录创建成功”是“文件创建”的前提。
实例演示
假设需要在 /tmp/docs/2023/reports/ 目录下创建 summary.txt 文件,且该目录路径可能不存在:

mkdir -p /tmp/docs/2023/reports && touch /tmp/docs/2023/reports/summary.txt
执行后,系统会自动创建 /tmp/docs/2023/reports/ 整个目录链(包括中间的 docs、2023 目录),并在其中生成 summary.txt 文件,可以通过 ls -l 验证:
ls -l /tmp/docs/2023/reports/ # 输出:-rw-r--r-- 1 user user 0 10月 1 10:30 summary.txt
处理带空格或特殊字符的路径
如果目录或文件名包含空格、引号等特殊字符,建议用双引号包裹路径,避免命令解析错误:
mkdir -p "/tmp/我的文档/2023/报告" && touch "/tmp/我的文档/2023/报告/数据分析.pdf"
进阶方法:使用 install 命令 —— 一键完成创建与权限设置
install 命令原本用于安装文件和目录,但它的 -d 选项(创建目录)和 -D 选项(创建目录并创建文件)可以更高效地实现“同时创建目录和文件”,且支持直接设置文件权限。
核心语法
install -D -m 权限 "文件路径"
-D:先创建文件所需的目录(如果不存在),再创建文件(相当于mkdir -p+touch的组合)。-m:可选,设置文件权限(如644、755),默认权限为644(文件所有者可读写,其他用户只读)。
实例演示
在 /tmp/config/ 下创建 app.conf 文件,并设置权限为 600(仅所有者可读写):
install -D -m 600 /tmp/config/app.conf
执行后,/tmp/config/ 目录会被自动创建(如果不存在),app.conf 文件生成并具有 600 权限:
ls -ld /tmp/config/ # 输出:drwxr-xr-x 2 user user 40 10月 1 10:35 /tmp/config/ ls -l /tmp/config/app.conf # 输出:-rw------- 1 user user 0 10月 1 10:35 /tmp/config/app.conf
复制文件并自动创建目录
如果需要将已有文件复制到目标路径(同时创建目录),可以用 install 的 --target-directory 选项:
install -D /path/to/source/file /path/to/target/directory/file
将当前目录的 script.sh 复制到 /tmp/bin/ 并自动创建目录:
install -D script.sh /tmp/bin/script.sh
脚本化方法:通过函数封装,提升复用性
如果需要在多个脚本或场景中重复“创建目录+文件”的操作,可以将其封装为 Shell 函数,减少重复代码。
定义函数
在 ~/.bashrc 或脚本文件中添加以下函数:
mkfile_with_dir() {
local file_path="$1"
# 检查参数是否为空
if [ -z "$file_path" ]; then
echo "错误:请指定文件路径" >&2
return 1
fi
# 提取目录路径(去掉文件名)
local dir_path=$(dirname "$file_path")
# 创建目录(如果不存在)
[ ! -d "$dir_path" ] && mkdir -p "$dir_path"
# 创建文件(如果不存在)
[ ! -f "$file_path" ] && touch "$file_path"
echo "已创建:$file_path"
}
使用函数
重新加载 ~/.bashrc(source ~/.bashrc)后,直接调用函数:
mkfile_with_dir "/tmp/logs/error.log" mkfile_with_dir "/var/www/html/index.html"
函数会自动检查目录是否存在,不存在则创建,再检查文件是否存在,不存在则生成,避免重复操作。
注意事项与常见问题
权限问题
-
如果当前用户对父目录没有写权限,
mkdir -p会失败(即使目录不存在),尝试在/root/下创建文件时,普通用户需使用sudo:sudo mkdir -p /root/test.txt && sudo touch /root/test.txt
-
install命令的-m选项设置的权限不会影响目录权限,目录权限仍受umask影响(默认0022,目录权限为755)。
覆盖风险
touch命令不会覆盖已存在的文件,只会更新其时间戳,如果需要强制覆盖,可以结合>:mkdir -p /tmp/test && echo "新内容" > /tmp/test/file.txt
路径不存在时的错误处理
mkdir -p失败(如权限不足),&&会阻止

