【问题标题】:Delete only directory contents using chef使用厨师仅删除目录内容
【发布时间】:2017-09-18 17:16:27
【问题描述】:

有没有一种方法可以只删除目录的内容而不删除实际的父目录?当我使用递归和动作删除时,实际的父目录也会被删除。

如果我指定路径 C:\chef\mydir,那么这个目录的所有内容(文件和子目录)都必须被删除,基本上是清空。我在 Windows 环境中。

任何正确方向的指导将不胜感激。

【问题讨论】:

    标签: windows chef-infra


    【解决方案1】:

    在 Chef 中(甚至在原始 Ruby 中)没有很好的方法来做到这一点。不过,您可以使用我的代码:https://github.com/poise/poise-archive/blob/master/lib/poise_archive/archive_providers/base.rb#L115-L119

    只要把它放在ruby_block 中就可以了。

    【讨论】:

    • 谢谢。这种方法可以“清空”目录。
    【解决方案2】:

    在 linux 中,您可以运行 rm -r dir/**/* 之类的命令来删除目录中的所有文件。这不会删除父目录。您可以将此添加到厨师食谱中。

    【讨论】:

      【解决方案3】:

      我不确定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
      

      如果有效,请告诉我。

      【讨论】:

      • 大部分都不是一个好主意。 windows_path 与目录无关(它与 $PATH 环境变量有关),文件资源路径中的 glob (*s) 将不起作用。
      • 感谢您的评论,从未在 windows 上使用过厨师 :)
      【解决方案4】:

      由于我对 Chef 的了解有限,我做了以下操作,因为我知道如何删除整个目录以及如何创建新目录。所采取的方法是删除目录,然后重新创建相同的目录,而不是尝试“清空”它。这可能是粗略的,但它符合我的目的。

      directory my_temp_dir do
      recursive true
      action [:delete, :create]
      only_if {::Dir.exist?(my_temp_dir)}
      end
      

      只有在删除操作并且必须满足“目录必须存在”的条件后才会执行创建操作。这样,我们可以确保不会在服务器上不必要地创建目录,因为最终目标是“清空”目录。

      【讨论】:

      • 这是一个很好的答案。我会说你不需要 only_if 。 Chef 自己执行此逻辑。如果目录不存在,它知道 :delete 不需要收敛并创建它。如果它确实存在,那么它将删除它然后运行 ​​:create 因为它不再存在了
      猜你喜欢
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 2017-07-05
      • 2011-01-13
      • 1970-01-01
      相关资源
      最近更新 更多