编写循环删除子目录指定文件的问题求助
解决方法
你的原命令存在几个关键问题:
./main_directory/*会匹配该目录下所有文件和子目录,如果目录下存在普通文件,cd到文件会直接报错- 每次
cd后没有回到原目录,第二次循环时当前路径已经是第一个子目录,再执行cd $file就会找不到正确路径 - 未处理目录名含空格或特殊字符的情况
下面给你两种可靠的解决方案:
方法1:改进循环(直接操作路径,无需cd)
用*/只匹配子目录,直接通过路径删除文件,避免cd带来的路径问题:
for dir in ./main_directory/*/; do rm "$dir"*.txt done
./main_directory/*/中的/确保只匹配子目录,不会选中普通文件"$dir"加引号是为了兼容目录名含空格、特殊字符的场景
方法2:用find命令(更灵活可靠)
如果子目录结构复杂,或者需要更精确的筛选控制,find命令是更好的选择:
find ./main_directory -type f -name "*.txt" -maxdepth 2 -mindepth 2 -delete
参数说明:
-type f:只匹配普通文件(排除目录)-name "*.txt":筛选后缀为.txt的文件-maxdepth 2 -mindepth 2:限制只查找main_directory下一级子目录里的文件,不会递归更深,也不会删除main_directory根目录下的txt文件-delete:直接删除匹配到的文件(如果想先预览要删除的文件,可去掉-delete,先查看输出确认)
内容的提问来源于stack exchange,提问作者captainnemo314
相关产品推荐
相关产品推荐

