如何使用xargs rm命令排除目录?解决脚本删文件目录报错问题
解决Shell脚本删除指定路径下特定文件外所有文件的问题
问题背景
原来执行ls | grep -v 'test.txt' | xargs rm时,会因为遇到dev_data目录报错rm: cannot remove ‘dev_data’: Is a directory,需要编写脚本实现:
- 跳过目标路径下的所有目录,仅删除普通文件
- 保留
test.txt不删除 - 额外清理
dev_data目录内的所有文件(不删除dev_data目录本身) - 执行时传入目标路径作为参数,比如
sh -x ig_dir.sh /alb/albt_shard/alb1/path1/path2/alb1/sub/alby
方案一:用for循环实现(直观易读)
保存为ig_dir.sh:
#!/bin/bash # 检查是否传入目标路径参数 if [ $# -ne 1 ]; then echo "用法: $0 <目标路径>" exit 1 fi TARGET_DIR="$1" # 进入目标目录,失败则退出 cd "$TARGET_DIR" || { echo "无法访问目录 $TARGET_DIR"; exit 1; } # 遍历当前目录,只删普通文件,保留test.txt for file in *; do if [ -f "$file" ] && [ "$file" != "test.txt" ]; then rm -f "$file" echo "已删除: $file" fi done # 清理dev_data目录内的所有文件 if [ -d "dev_data" ]; then echo "开始清理dev_data目录..." for sub_file in dev_data/*; do if [ -f "$sub_file" ]; then rm -f "$sub_file" echo "已删除dev_data内文件: $sub_file" fi done fi
使用步骤
- 给脚本加执行权限:
chmod +x ig_dir.sh - 执行脚本:
sh -x ig_dir.sh /alb/albt_shard/alb1/path1/path2/alb1/sub/alby
方案二:用find命令实现(简洁高效)
find命令天生适合处理文件查找和删除,能避免文件名含空格、特殊字符的问题:
#!/bin/bash # 检查参数合法性 if [ $# -ne 1 ]; then echo "用法: $0 <目标路径>" exit 1 fi TARGET_DIR="$1" # 删除目标路径下除test.txt外的所有普通文件(不递归子目录) find "$TARGET_DIR" -maxdepth 1 -type f ! -name 'test.txt' -delete # 删除dev_data目录内的所有普通文件(不递归dev_data的子目录) find "$TARGET_DIR/dev_data" -maxdepth 1 -type f -delete
命令参数说明
-maxdepth 1:只处理当前层级的文件,不深入子目录-type f:只匹配普通文件,跳过目录、链接等! -name 'test.txt':排除名为test.txt的文件-delete:直接删除匹配到的文件,安全可靠
内容的提问来源于stack exchange,提问作者Sherin Shaziya
相关产品推荐
相关产品推荐

