如何在Bash中删除目录内所有内容但保留子目录中的指定文件?
Bash 删除目录内容但保留指定文件的方法
下面提供几种可靠的实现方式,根据你的场景选择即可:
方法一:临时移动保留文件(直观易理解)
先把要保留的文件移到安全位置,清空目标目录后再移回,适合新手操作:
# 将目标文件临时移到当前工作目录 mv d1/d2/f1.txt ./ # 清空d1目录下所有内容 rm -rf d1/* # 重建原路径的目录结构 mkdir -p d1/d2 # 将文件移回原位置 mv f1.txt d1/d2/
方法二:用find命令精准排除(无需移动文件)
通过find命令匹配所有需要删除的内容,排除指定文件后直接删除:
# 删除d1下所有非保留的文件 find d1 -type f -not -path "d1/d2/f1.txt" -delete # 删除d1下所有空目录(避免残留空文件夹) find d1 -type d -empty -delete
如果不需要保留空目录,也可以用更简洁的单条命令(注意:若目标文件所在目录非空,该命令不会删除此目录):
find d1 -mindepth 1 -not -path "d1/d2/f1.txt" -delete
方法三:rsync同步空目录(高效批量操作)
利用rsync的同步特性,用空目录作为源,删除目标目录中多余的内容,同时排除要保留的文件:
# 创建临时空目录 mkdir empty_dir # 同步空目录到d1,删除d1中不存在于空目录的内容,同时排除指定文件 rsync -av --delete --exclude="d2/f1.txt" empty_dir/ d1/ # 清理临时目录 rmdir empty_dir
内容的提问来源于stack exchange,提问作者Jackoo
相关产品推荐
相关产品推荐

