删除一个目录下的所有文件但保留一个指定文件

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dgd2010.blog.51cto.com/1539422/1735050

之前看过oldboy(老男孩)前辈的一篇文章《linux面试题:删除一个目录下的所有文件,但保留一个指定文件》,近日终于有机会得以验证,但与老男孩前辈的文章中具体讲的有些不太一样,故而专门写一篇文章重新整理这个问题。虽然是同一个话题,和同一种思路,但细节上有一定的差别。

需求:

删除一个目录下的所有文件,但保留一个指定文件。

场景与要求:

  1. 目录下有目录和文件,目录下有子目录和子文件(这是通常的场景)
  2. 目录下有符号链接文件、隐藏文件等
  3. 如果是当前目录,则需要排除当前目录
  4. 执行成功则返回代码0,并且不提示任何警告和错误

解决办法:

例如删除当前目录下的所有文件,除了deploy.sh(原始场景:deploy.sh完成部署工作,但不需要此项目时,执行destroy函数,删除当前目录下的所有文件,除了deploy.sh文件本身)

简单验证,可以如此执行:


1

find -L ./ -maxdepth 1 ! -name "deploy.sh" ! -wholename "./"

如果是真的要删除,则是(也是此文主要想表达的方式):


1

find -L ./ -maxdepth 1 ! -name "deploy.sh" ! -wholename "./" -exec rm -rf {} \;

如果放到脚本中执行,则可以(其中$WORKDIR是脚本工作目录):


1

find -L $WORKDIR -maxdepth 1 ! -name "$(basename $0)" ! -wholename "$WORKDIR"  -exec rm -rf {} \;

原理或解释:

主要是利用find命令结合rm命令,

  • -L 表示find时包含符号链接文件
  • -maxdepth 1 表示查找目录深度为1,也就是只处理目录下的目录和文件,其他的目录中的文件或目录一概不做处理,如果不指定此参数,很有可能遭遇“No such file or directory”问题,原因是,find出来的内容是无法经过排序的,有时会造成父目录已经被rm删除,子目录的路径信息还会传递给rm,造成rm无法找到文件或目录,从而报错。
  • ! -name "$(basename $0)"  表示不包含当前脚本名字的文件
  • ! -wholename "$WORKDIR"  表示不包含脚本或命令所在的当前工作目录,之所以用-wholename而不是-name是因为兼容某些Unix系统,如果仅用-name会得到一条警告“find: warning: Unix filenames usually don't contain slashes (though pathnames do).  That means that '-name `./deploy.sh'' will probably evaluate to false all the time on this system.  You might find the '-wholename' test more useful, or perhaps '-samefile'.  Alternatively, if you are using GNU grep, you could use 'find ... -print0 | grep -FzZ `./deploy.sh''.”。

tag:find和rm删除,find删除文件,find符号链接文件,find maxdepth用途,find删除

--end--

本文出自 “通信,我的最爱” 博客,请务必保留此出处http://dgd2010.blog.51cto.com/1539422/1735050

时间: 2025-01-02 14:57:04

删除一个目录下的所有文件但保留一个指定文件的相关文章

如何删除Linux一个目录下部分类型之外的所有文件的三种方法

有的时候,你可能会遇到这种情况,你需要删除一个目录下的所有文件,或者只是简单的通过删除除了一些指定类型(以指定扩展名结尾)之外的文件来清理一个目录. 在这篇文章,我们将会向你展现如何通过 rm. find 和 globignore 命令删除一个目录下除了指定文件扩展名或者类型的之外的文件. 在我们进一步深入之前,让我们开始简要的了解一下 Linux 中的一个重要的概念 -- 文件名模式匹配,它可以让我们解决眼前的问题. 在 Linux 下,一个 shell 模式是一个包含以下特殊字符的字符串,称

删除一个目录下部分类型之外的所有文件的三种方法

有的时候,你可能会遇到这种情况,你需要删除一个目录下的所有文件,或者只是简单的通过删除除了一些指定类型(以指定扩展名结尾)之外的文件来清理一个目录. 在这篇文章,我们将会向你展现如何通过 rm. find 和 globignore 命令删除一个目录下除了指定文件扩展名或者类型的之外的文件. 在我们进一步深入之前,让我们开始简要的了解一下 Linux 中的一个重要的概念 -- 文件名模式匹配,它可以让我们解决眼前的问题. 在 Linux 下,一个 shell 模式是一个包含以下特殊字符的字符串,称

java-如何使用Java程序或shell脚本删除某目录下匹配文件名的文件.

问题描述 如何使用Java程序或shell脚本删除某目录下匹配文件名的文件. 如何使用Java程序或shell脚本删除某目录下匹配文件名的文件. 解决方案 Java的话,直接调用File的delete方法就可以了.比如你拿到了要删除文件的路径为path.代码如下 File file = new File(path); file.delete(); 解决方案二: 先判断file是目录还是文件,如果是文件就匹配文件名删除,是目录就遍历,继续判断目录或文件(递归) 解决方案三: 要使用shell脚本删

批量删除-咋样快速删掉一个目录下大小相同的页面?

问题描述 咋样快速删掉一个目录下大小相同的页面? 是这样的.我写的爬虫抓取了100000w个页面.一大半是404....该怎么批量删除?不会又要写个脚本吧... 解决方案 排序,选中,删除 解决方案二: 这个用脚本不是好容易的事情嘛,遍历文件,判断条件,删除.都很简单的操作.

什么函数能够把文件从一个目录下转移到另外一个目录下?

函数 问:什么函数能够把文件从一个目录下转移到另外一个目录下? 答:PHP中没有直接转移的函数.不过你可以试着这样来做. <?phprename("a/ss.txt","b/ss.txt");?>

javascript-如何在JavaScript链接打开另一个目录下的网页文件

问题描述 如何在JavaScript链接打开另一个目录下的网页文件 我在JavaScript里用prompt来接受输入, 输入不同的内容, 可以打开不同的页面,链接部分应该怎么写呢? 或者用document.getElementById("text").value来获取html文本框的内容 ,该怎么根据不同的输入打开不同的页面呢? 解决方案 prompt接收的内容是路径的话,可以location.href=url 就可以调到指定页面 解决方案二: 可以给用户提示下,可以选择的项,我觉得

java中如何拷贝文件到另一个目录下只能使用

问题描述 java中如何拷贝文件到另一个目录下只能使用 在只能使用字节流ByteArrayInputStream和ByteArrayOutputStream 的情况下,如何复制指定路劲的文件夹到指定的路径下 解决方案 /** * 复制单个文件 * @param oldPath String 原文件路径 如:c:/fqf.txt * @param newPath String 复制后路径 如:f:/fqf.txt * @return boolean */ public void copyFile(

linux find下如何统计一个目录下的文件个数以及代码总行数的命令_unix linux

今天遇到如题所示问题,网上捣鼓半天,有收获     知道指定后缀名的文件总个数命令:        find . -name "*.html" | wc -l     知道一个目录下代码总行数以及单个文件行数:        find . -name "*.html" | xargs wc -l

tomcat 6.0.18 work目录下 未保存jsp对应的servelt java文件

问题描述 tomcat 6.0.18 work目录下 未保存jsp对应的servelt java文件 而只有其class文件这个是什么原因呢或者需要怎样配置呢 谢谢! 问题补充:我是直接在myeclipse里的 servers View 里直接选择该工程部署到tomcat服务器里也就相当于直接放在 其webappps目录下的 解决方案 那这个就有点奇怪了.这样试试:你把项目直接拷贝到tomcat的webappps目录下,然后清除缓存,启动tomcat,看能否正常生成文件,如果还是不行,你再拷贝另