求助:如何删除含空files.txt的子目录?Bash脚本参数过多报错
解决删除包含空
files.txt的子目录问题 你的脚本出现"too many arguments"错误以及逻辑偏差,我来逐一拆解问题并给出正确的解决方案:
原脚本的问题分析
- 参数过多错误:
*/files.txt会被bash展开成所有匹配的文件路径(比如dir1/files.txt dir2/files.txt ...),当子目录数量较多时,传给[ -s ]的参数会超过命令行长度限制,直接触发报错。 - 逻辑判断错误:
[ -s */files.txt ]的逻辑是只要有一个文件非空,整个条件就返回真,根本无法逐个检查每个子目录下的files.txt状态。 - 路径获取错误:
line=pwd没有使用命令替换(正确写法是line=$(pwd)),而且就算改了,pwd返回的是当前工作目录,不是你要检查的子目录路径,完全不符合需求。
正确的脚本写法
下面的脚本会逐个遍历每个子目录下的files.txt,判断是否为空后再删除对应的子目录:
#!/bin/bash # 遍历当前目录下所有子目录中的files.txt文件 for file in */files.txt; do # 提取子目录路径(去掉末尾的"/files.txt"后缀) target_dir="${file%/files.txt}" # 判断文件是否为空(! -s 表示文件存在且大小为0) if [ ! -s "$file" ]; then echo "删除空文件所在的目录: $target_dir" rm -r "$target_dir" fi done
脚本工作原理
for file in */files.txt:遍历当前目录下所有子目录中的files.txt,每个文件路径会被赋值给file变量。${file%/files.txt}:使用bash的参数扩展功能,去掉file变量末尾的/files.txt,精准得到对应的子目录路径。[! -s "$file" ]:-s用于检查文件是否存在且大小大于0,加!取反后,就表示文件为空(存在但大小为0)。- 确认文件为空后,用
rm -r删除对应的子目录,双引号包裹变量可以避免目录名含空格/特殊字符时出现解析错误。
注意事项
- 建议先运行只带
echo的版本,确认要删除的目录是否正确,再去掉echo执行实际删除操作,避免误删。 - 如果你的子目录中可能存在没有
files.txt的情况,可以补充文件存在判断:if [ -f "$file" ] && [ ! -s "$file" ]; then。
内容的提问来源于stack exchange,提问作者Amar
相关产品推荐
相关产品推荐

