【发布时间】:2017-09-18 17:16:27
【问题描述】:
有没有一种方法可以只删除目录的内容而不删除实际的父目录?当我使用递归和动作删除时,实际的父目录也会被删除。
如果我指定路径 C:\chef\mydir,那么这个目录的所有内容(文件和子目录)都必须被删除,基本上是清空。我在 Windows 环境中。
任何正确方向的指导将不胜感激。
【问题讨论】:
标签: windows chef-infra
有没有一种方法可以只删除目录的内容而不删除实际的父目录?当我使用递归和动作删除时,实际的父目录也会被删除。
如果我指定路径 C:\chef\mydir,那么这个目录的所有内容(文件和子目录)都必须被删除,基本上是清空。我在 Windows 环境中。
任何正确方向的指导将不胜感激。
【问题讨论】:
标签: windows chef-infra
在 Chef 中(甚至在原始 Ruby 中)没有很好的方法来做到这一点。不过,您可以使用我的代码:https://github.com/poise/poise-archive/blob/master/lib/poise_archive/archive_providers/base.rb#L115-L119
只要把它放在ruby_block 中就可以了。
【讨论】:
在 linux 中,您可以运行 rm -r dir/**/* 之类的命令来删除目录中的所有文件。这不会删除父目录。您可以将此添加到厨师食谱中。
【讨论】:
我不确定windows,但你可以试试:
操作 此资源具有以下操作:
:什么都没有 阻止命令运行。该动作用于 指定命令仅在另一个资源通知它时运行。
:运行默认值。 运行命令。
execute "delete_files" do
command "del /s /q /F *"
cwd "C:\chef\mydir"
end
删除单个文件:
file 'delete_files' do
path 'C:\\chef\\mydir\\my.file'
action :delete
end
如果有效,请告诉我。
【讨论】:
*s) 将不起作用。
由于我对 Chef 的了解有限,我做了以下操作,因为我知道如何删除整个目录以及如何创建新目录。所采取的方法是删除目录,然后重新创建相同的目录,而不是尝试“清空”它。这可能是粗略的,但它符合我的目的。
directory my_temp_dir do
recursive true
action [:delete, :create]
only_if {::Dir.exist?(my_temp_dir)}
end
只有在删除操作并且必须满足“目录必须存在”的条件后才会执行创建操作。这样,我们可以确保不会在服务器上不必要地创建目录,因为最终目标是“清空”目录。
【讨论】: