![Shell 命令以递归方式删除文件夹内容(排除隐藏文件)?](https://linux22.com/image/1338617/Shell%20%E5%91%BD%E4%BB%A4%E4%BB%A5%E9%80%92%E5%BD%92%E6%96%B9%E5%BC%8F%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E5%A4%B9%E5%86%85%E5%AE%B9%EF%BC%88%E6%8E%92%E9%99%A4%E9%9A%90%E8%97%8F%E6%96%87%E4%BB%B6%EF%BC%89%EF%BC%9F.png)
我想删除文件夹及其子文件夹的内容,但不删除文件夹和子文件夹中的隐藏文件。如何使用 shell 脚本来实现这一点?
我已尝试过rm -rf foldername
但它正在删除全部内容。
答案1
除了使用-exec
或 之外xargs
,您还可以执行以下操作:
find folder_name -not -name ".*" -delete
- 这将删除所有不以
.
(隐藏文件/文件夹)开头的文件和文件夹 - 当且仅当文件夹为空时才会删除文件夹(因此它不会按要求删除包含隐藏文件的文件夹)
答案2
这是个棘手的问题。解决方案概要如下:
find foldername -type f ! -name '.*' -exec rm -f {} +
find foldername -type d -depth -exec rmdir {} + 2>/dev/null
第一个命令删除名称不以 开头的文件.
;第二个命令尝试删除目录。该-depth
选项表示先删除子目录,再删除目录。符号+
来自 POSIX 2008find
但在 Mac OS X(10.7.5,无论如何)上运行良好。 它2>/dev/null
会将所有“目录不为空”错误消息(以及所有其他消息)发送到遗忘处。
您可能会遇到与符号链接、Unix 套接字、FIFO 和其他非文件有关的问题;请调整第一个命令以满足您的要求。如果您使用!
历史记录,则可能需要将其转义。
答案3
-name "*"
通过向命令传递参数find
将默认保留所有隐藏文件。因此您可以使用以下命令。
find . -name "*"|xargs rm -f
答案4
你可以使用这个命令:
find foldername/ -type f -not -name '.*' | xargs rm -f
find 命令查找 foldername/ 下所有名称不以“.”开头的文件(隐藏文件),并将它们传递给 xargs,后者对它们运行 rm -f。