拓冰建站拓冰建站
首页 / 资讯中心 / 正文

curl `--create-dirs` 参数全解析:自动创建本地输出目录层级

curl--create-dirs参数全解析自动创建本地输出目录层级【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl--create-dirs是 curl 命令行工具docs/cmdline-opts/create-dirs.md中负责按需创建本地目录层级的输出类选项当下载文件要保存到尚不存在的深层本地路径时它能让 curl 先把各级目录自动建好避免no such directory式的写入失败。本文将以该选项的官方文档为主线结合 curl 源码中目录创建函数create_dir_hierarchy()的实现与配套测试完整讲解它的使用场景、权限行为、适用边界以及与--output-dir、--ftp-create-dirs等邻近选项的分工关系。读完本文你将能熟练利用该选项编写目录即存即用的下载脚本并理解其底层工作机理。选项速览--create-dirs的基本元信息如下摘自文档 front matter属性值长选项--create-dirs短选项无说明Create necessary local directory hierarchy创建必要的本地目录层级功能分类output输出类引入版本7.10.3取值方式Multi: boolean布尔开关可多次指定关联选项--ftp-create-dirs、--output-dir在参数解析表中该选项注册于 src/tool_getparam.c{create-dirs, ARG_BOOL, , C_CREATE_DIRS}命中后写入OperationConfig结构体的布尔位config-create_dirs见 src/tool_cfgable.h其默认值为FALSE见 src/tool_cfgable.c。也就是说curl 默认不会为输出文件预先创建目录必须显式开启本选项。功能定义何时会创建、何时不会按照官方文档的精确表述--create-dirs的行为遵循以下三条规则必须与--output即-o系列输出方式配合使用curl 才会按需创建本地目录层级需要创建的目录范围 --output指定的文件名路径再加上--output-dir可能设置的前缀目录如果合并后的输出文件名不含任何目录部分或者路径中提到的目录已经存在则 curl 不会创建任何目录。例如官方示例curl --create-dirs --output local/dir/file $URL执行后若local/、local/dir/尚不存在curl 会依次创建它们再把响应内容写入local/dir/file若这些目录已存在或$URL直接对应-o filename这种无目录的文件名则不做任何创建动作。典型实战场景一URL 通配符批量下载到分级目录目录自动创建的典型驱动力来自 curl 的 URL 通配符globbing批量下载。源码在 src/tool_dirhie.c 的注释中给出了设计初衷curl http://example.org/dir[1-5]/file[1-5].txt -o dir#1/file#2.txt当#1、#2被展开为dir1/file1.txt、dir2/file2.txt等不同组合时输出路径会跨越多个不同的子目录。配合--create-dirscurl 会为每个展开结果自动补齐对应的dirN/目录从而实现边展开边落地的分级存储。典型实战场景二把整个 URL 路径镜像到本地借助--output-dir指定根目录、再用--create-dirs补全中间层可以很方便地把 URL 的多级路径还原为本地目录结构curl --output-dir mirror --create-dirs \ https://example.com/2026/docs/manual.pdf -o 2026/docs/manual.pdf注意 docs/cmdline-opts/output-dir.md 明确说明--output-dir指定的目录本身若不存在操作会失败除非同时使用--create-dirs。因此上面这个组合正是让整棵本地目录树含根目录mirror/一次性生成的标准写法。该选项作用于命令行中所有 URL直到遇到下一个--next为止。目录权限Unix 下的 0750官方文档明确在 Unix 风格文件系统上新建目录的权限为 mode 0750即rwxr-x---属主可读写执行、属组可读执行、其他用户无任何权限。这一行为与实现一致——src/tool_dirhie.c 中调用mkdir时传入的权限位正是(mode_t)0000750。需要说明的是和一切mkdir调用相同最终生效权限通常还会受进程umask影响同时本选项只作用于本地文件系统与下载所用协议HTTP、FTP、SFTP 等无关。连带生效--dump-header与--etag-save同样受益--create-dirs并不只作用于--output。查看 src/tool_operate.c 可知凡是以文件形式落盘的输出路径在打开前都会检查该开关并调用目录创建逻辑输出正文文件setup_outfile()在拼接完--output-dir前缀后、真正打开文件前调用create_dir_hierarchy(per-outfile)src/tool_operate.c响应头转储setup_headerfile()在打开--dump-header指定的文件前调用create_dir_hierarchy(config-headerfile)src/tool_operate.cETag 保存etag_store()在写--etag-save文件前调用create_dir_hierarchy(config-etag_save_file)src/tool_operate.c。这意味着下述命令同样可以放心使用多级不存在的目录# 响应头保存到尚不存在的 tmp/heads/out.txt curl --create-dirs --dump-header tmp/heads/out.txt https://example.com/ # ETag 保存到尚不存在的缓存/etag/ 下 curl --create-dirs --etag-save cache/etag/last.txt https://example.com/源码级实现剖析目录创建的底层实现在 src/tool_dirhie.c 的函数CURLcode create_dir_hierarchy(const char *outfile)声明见 src/tool_dirhie.h其算法可以概括为逐段累积前缀、逐级 mkdir用一个动态缓冲区dynbuf从头开始累积路径分量通过strspn/strcspn识别路径分隔符与目录名把分隔符目录名逐段追加进缓冲区遇到最后一个分量文件名其后即为空字节时立即停止循环因此永远不会把文件名当作目录去创建对每个累积出的前缀调用底层toolx_mkdir(dir, 0000750)一旦某个中间目录创建失败且错误码不是EEXIST或EACCES立即停止并返回CURLE_WRITE_ERROR。其中两点值得展开错误容忍策略EEXIST目录已存在被显式忽略保证目录已存在时不创建的文档语义EACCES被忽略则是为了允许穿越——当某个深层目录虽然不可创建但其上级具备访问权时遍历可以继续进行源码注释原话为 Ignore access denied error to allow traversal。可读的错误信息真正失败时show_dir_errno()会根据errno输出友好的中文无关诊断见 src/tool_dirhie.c例如权限不足EACCES、目录名过长ENAMETOOLONG、只读文件系统EROFS、磁盘满ENOSPC、配额超限EDQUOT等并统一返回写错误CURLE_WRITE_ERROR。平台差异底层 mkdir 经由宏toolx_mkdir适配不同平台src/tool_dirhie.cWindows_WIN32使用_mkdir(x)单参数权限位参数被丢弃MS-DOS非 DJGPP使用单参数的mkdir(x)其他平台直接调用标准mkdir(x, y)即传入 0750 权限位单元测试构建下则替换为create_dir_hierarchy_trace_mkdir用于记录调用轨迹。此外在 Windows / MS-DOS 上路径分隔符同时接受\与/PATH_DELIMITERS \\/且会跳过对裸盘符如C:的单独创建避免误建名为C:的目录src/tool_dirhie.c。测试验证仓库如何保障该行为curl 仓库用两类测试锁定了上述行为单元测试tests/tunit/tool1720.c注册于 tests/data/test1720以输入路径 → 期望创建的目录列表配对方式验证分段逻辑。例如filename纯文件名→ 不创建任何目录foo/bar/filename→ 依次创建foo、foo/barfoo/bar/→ 依次创建foo、foo/bar末尾以分隔符结尾时同样只建到倒数第二层/foo/bar/filename→ 依次创建/foo、/foo/barWindows 分支还覆盖了C:/foo/bar/filename会创建C:/foo、C:/foo/bar而C:foo/bar/filename只创建C:foo、C:foo/bar等盘符场景。集成测试feature/数据文件形式tests/data/test3011--output-dir与--create-dirs组合使用验证整棵目录树落地tests/data/test3031--dump-header与--create-dirs组合tests/data/test693--etag-save与--create-dirs组合。与--ftp-create-dirs的分工本地目录 vs 远端目录--create-dirs只能解决**本地运行 curl 的机器上**的目录问题。若目标路径位于 FTP/SFTP 服务器上且该目录在服务端尚不存在标准行为是直接失败此时应改用--ftp-create-dirs引入于 7.10.7见 docs/cmdline-opts/ftp-create-dirs.md它会让 curl 通过协议层在服务端补建缺失目录curl --ftp-create-dirs -T file ftp://example.com/remote/path/file两个选项在 docs/cmdline-opts/create-dirs.md 中互为 See-also且可同时出现在一条命令行里一个负责本地落盘路径一个负责远端上传路径。上传场景的完整形态通常是curl --create-dirs -o /tmp/upload.log \ --ftp-create-dirs -T ./build/pkg.tar.gz \ ftp://example.com/releases/2026/archive/pkg.tar.gz常见误区与注意事项不能独立生效--create-dirs单独存在时不做任何事它只作用于输出类路径--output、--output-dir、--dump-header、--etag-save等落盘目标不做多余动作目录已存在或路径不含目录时零开销、零副作用不清理、不覆盖它只负责创建缺失的目录从不删除已有目录也不干预同名文件与--no-clobber、断点续传-C -等文件级策略的配合顺序——目录创建发生在文件打开与断点统计之前权限细节Unix 下新建目录默认请求 0750与通常系统默认的 0777 受 umask 约束不同属组外用户默认不可访问新目录失败即报错任何中间目录因权限、磁盘满、只读文件系统等原因无法创建时curl 输出对应诊断并返回写错误而不会静默跳过——相关错误分支逻辑见 src/tool_dirhie.c。小结--create-dirs是 curl 输出体系中一个简洁但高频的开关它把多级目录不存在导致下载/转储失败这一常见痛点收敛为一次显式的布尔开关再交由create_dir_hierarchy()以逐级mkdir的方式自动补齐目录树并以 0750 权限、EEXIST/EACCES容忍策略和友好错误诊断保证脚本的健壮性。配合--output-dir可整体镜像 URL 目录结构配合--ftp-create-dirs则可同时打通本地与远端两侧的目录创建是编写批量下载与镜像类脚本时值得优先启用的选项之一。【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门