如何递归循环遍历目录以删除特定扩展名的文件
问题的出现原因是需要递归遍历一个目录,并删除特定扩展名的文件。文章提供了多种解决方法。
第一种解决方法是使用for循环来遍历目录,并删除文件。这种方法简单直接,但在处理文件名中包含空格和通配符字符时会出错。
第二种解决方法是在第一种方法的基础上添加临时设置IFS和禁用通配符扩展来解决空格和通配符字符的问题。
第三种解决方法是使用xargs来处理具有特殊字符的文件名,这种方法适用于包含换行符的文件名。
第四种解决方法是使用GNU和*BSD find的-delete操作,这种方法可以直接删除文件,但在文件名中包含空格时会出错。
最后,文章提到了一个关于为什么不使用find的-delete标志的讨论,并提供了相关链接进行了解。
文章介绍了四种解决方法,分别是使用for循环、临时设置IFS和禁用通配符扩展、使用xargs和使用find的-delete标志。这些方法可以帮助读者递归遍历目录并删除特定扩展名的文件。
如何循环递归地遍历目录以删除特定扩展名的文件
在没有使用`find`命令的情况下,可以使用bash脚本来循环遍历目录并删除特定扩展名的文件。以下是一个示例代码:
shopt -s globstar for f in /tmp/*.pdf /tmp/*.doc tmp/**/*.pdf tmp/**/*.doc ; do rm "$f" done
这段代码的作用是递归地遍历`/tmp`目录下的所有`.pdf`和`.doc`文件,并删除它们。需要注意的是,这段代码要求使用bash版本大于等于4.0,并且需要启用`globstar`选项。
如果要处理包含空格的文件名,这种方法也适用于OSX系统。
值得注意的是,`globstar`选项仅在Bash 4.0或更高版本中可用,而不是许多机器上的默认版本。
此外,如果希望查找隐藏文件,可以使用`shopt -s dotglob`命令。另外,如果存在一个扩展名为空的空目录,上述命令也会将其删除,可以通过添加判断条件`[[ -f $f ]] && rm "$f"`来避免这种情况。
需要注意的是,`**`在POSIX的`sh`中不可用,因此这段代码只适用于Bash或其他扩展的shell。
根据反馈,上述代码可能会漏掉隐藏文件夹和多层嵌套的文件夹。可以通过修改代码来解决这个问题。
文章来源:https://stackoverflow.com/questions/11912459
如何递归循环遍历目录以删除特定扩展名的文件
在这个问题中,用户想要找到一种方法来递归地遍历目录并删除特定扩展名的文件。用户提到了使用find
命令的方法,并给出了一个示例命令find /tmp -name '*.pdf' -or -name '*.doc' | xargs rm
,以及使用-delete
选项的方法。
另一位用户指出,为了避免文件名中包含换行符而导致的问题,应该始终使用find ... -print0 | xargs -0 ...
,而不是直接使用find | xargs
。
然而,另一位用户认为使用没有任何选项的xargs
几乎总是不好的建议,应该使用find ... -exec
代替。
然后,用户'SO-stopbeingevil'问为什么xargs
是不好的建议。
用户'äck'解释说,xargs
期望的输入语法并不是find
(或任何其他常见命令)的输出语法。因此,使用xargs
可能会导致问题。
另一位用户询问是否可以在找到的文件上使用sed
命令。
最后,用户提到使用-delete -print
选项可以使find
在删除文件时打印文件名。
用户想要找到一种递归循环遍历目录并删除特定扩展名文件的方法。他们提到了使用find
命令和xargs
命令的方法,以及一些注意事项。