Shell 命令以递归方式删除文件夹内容(排除隐藏文件)?

Shell 命令以递归方式删除文件夹内容(排除隐藏文件)?

我想删除文件夹及其子文件夹的内容,但不删除文件夹和子文件夹中的隐藏文件。如何使用 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。

相关内容