Example 1
- 遍历删
*.e<一串数字> 和 *.o<一串数字> 文件,在 grep 用正则表达式筛选要删的文件[2,3]。
clean()
{
echo "->" cleaning: $1
ls -d $1/* | grep -E "*.[oe][0-9]+" | xargs rm
for f in `ls -a $1`; do
if [ -d $1/$f ]; then
if [[ $f != '.' && $f != '..' ]]; then
clean $1/$f
fi
fi
done
}
clean $(pwd)
Example 2
- 递归删
events.out.tfevents.* 和 *.pth,同时打印遍历的目录结构(用 printf 格式化输出)。 - 用
2>/dev/null 屏蔽 ls 和 rm 在无匹配时的报错输出[9]。rm 也可以用 -f 参数,但这用起来有点怕删错。(windows 下的屏蔽见 [10,11]) - 不启用
set -e,因为 ls 和 rm 虽然被屏蔽输出,在无匹配时依然会报错,如果用了 set -e 就可能会因为报错中途退出。
#!/bin/bash
clean()
{
if [ $2 -gt 1 ]; then
printf "| %.0s" $(seq 2 $2)
fi
if [ $2 -gt 0 ]; then
printf "|- "
fi
echo $1/
cd $1
rm events.out.tfevents.* 2>/dev/null
rm *.pth 2>/dev/null
for d in `ls -d */ 2>/dev/null`; do
clean `basename $d` `expr $2 + 1`
done
cd ..
rmdir $1 2>/dev/null
}
for d in `ls -d */ | grep log`; do
clean `basename $d` 0
done
References
- SHELL递归遍历文件夹下所有文件
- rm 使用正则表达式 删除文件
- shell|rm 使用正则表达式过滤出要删除的文件
- Linux Shell 只列出目录的方法
- Linux shell 之 提取文件名和目录名的一些方法
- Shell printf 命令
- How can I repeat a character in Bash?
- Linux command to repeat a string n times
- How to “mute” ls command?
- Suppress command line output
- dos bat批量创建软链接
- dos递归遍历目录删log