请求修正Linux Shell循环批量在各文件夹创建文件的命令
解决循环在子文件夹创建文件的问题
你猜的方向没错,但还有个更关键的细节你没注意到——第一次切换目录后,你没回到原目录!
咱们拆解下你原命令的执行逻辑就懂了:
- 循环第一个目标是
1/,执行cd 1/成功进入子目录,接着创建test.txt,这步没问题; - 循环第二个目标是
2/,但此时你还在./1/目录里,执行cd 2/自然找不到这个文件夹,直接报错; - 后续所有循环都会重复这个错误,自然只有第一个文件夹里生成了文件。
另外补充个小坑:用ls遍历文件/目录其实是个坏习惯,要是遇到带空格或特殊字符的文件夹名,直接就会出错。更稳妥的方式是用通配符*/来匹配所有子目录。
给你几个修正后的方案,按推荐程度排序:
方案1:不切换目录,直接创建文件(最推荐)
不用来回切换目录,直接通过路径拼接创建文件,简单又安全:
for i in */; do touch "$i/test.txt"; done
*/会精准匹配当前目录下所有子目录(末尾的/能避免匹配普通文件);"$i"加双引号是为了兼容带空格、特殊字符的目录名。
方案2:切换目录后及时返回
如果一定要用cd的方式,记得每次操作完要回到原目录,或者用子shell隔离目录变化:
方式A:手动返回上级目录
for i in */; do cd "$i"; touch test.txt; cd ..; done
方式B:用子shell隔离环境
把切换目录和创建文件的命令放在括号里,子shell的目录变化不会影响父shell,执行完自动回到原目录:
for i in */; do (cd "$i"; touch test.txt); done
方式C:用pushd/popd管理目录
适合目录层级复杂的场景,pushd保存当前目录,popd快速恢复:
for i in */; do pushd "$i"; touch test.txt; popd; done
内容的提问来源于stack exchange,提问作者huang cheng
相关产品推荐
相关产品推荐

