花括号用于批量创建编号文件,如touch file{1..3};引号会抑制花括号展开,导致生成字面名。跨平台设时间戳优先用-t,权限由umask决定,超量文件需用xargs或循环拆分。

touch 一次创建多个空文件要加花括号还是引号?
直接用 touch 批量建文件,最常踩的坑是 shell 展开失败或生成了带空格的怪名字。比如写 touch file{1..3} 能正常生成 file1、file2、file3;但写 touch "file{1..3}" 就只会建一个叫 file{1..3} 的文件——花括号展开发生在引号外,引号会抑制它。
- 想批量编号:用
touch file{1..10},别加引号 - 想带前缀+日期:用
touch "log_$(date +%Y%m%d)_{1..5}"不行,得拆成for i in {1..5}; do touch "log_$(date +%Y%m%d)_$i"; done - 文件名含空格?必须单个加引号:
touch "my file.txt" "another one.log",不能靠花括号批量包住
touch -t 和 touch -d 时间戳设置谁更可靠?
touch -t 要求严格格式([[CC]YY]MMDDhhmm[.SS]),比如 touch -t 202405201430.25 file.txt;touch -d 支持自然语言("last Friday"、"2 hours ago"),但依赖系统 locale 和 GNU coreutils,非 Linux 环境(如 macOS 的 BSD touch)压根不支持 -d。
- 跨平台脚本里,优先用
-t,哪怕多算几秒也要保证可移植 -
-d在 Linux 上方便调试,但别用于生产部署脚本 - 注意时区:
-d "2024-05-20 14:30:00"默认按本地时区解析,加UTC或+0000才明确
为什么 touch 创建的文件有时权限不是 644?
touch 本身不设权限,它只是更新时间戳或创建空文件,实际权限由 umask 决定。比如你 umask 是 0022,新建文件就是 644;如果 umask 是 0002,就会是 664。这不是 touch 的 bug,是 Unix 文件创建机制本身的行为。
- 确认当前 umask:
umask命令输出三位八进制数 - 临时改权限:先
touch,再chmod 644 *.txt,别指望touch自带 chmod - 脚本中需固定权限?用
install -m 644 /dev/null filename更直接
批量 touch 遇到 “Argument list too long” 怎么办?
当你要建上万个文件,比如 touch file{1..50000},shell 会报 /bin/touch: Argument list too long——这是 execve 系统调用的参数长度限制,和 touch 无关。
- 用
xargs拆分:printf 'file%05d\n' {1..50000} | xargs -n 1000 touch - 用循环更稳:
for i in {1..50000}; do touch "file$i"; done(慢但不爆内存) - 避免生成超长命令行:别用
eval拼接大字符串,容易越界又难 debug
真正麻烦的是混合场景:既要编号、又要设时间戳、还要控制权限、还得过万文件——这时候别硬套 touch,该上 Python 或 awk 就上,touch 的设计定位就是轻量、快速、做一件事。










