【问题标题】:what is the diff between rm -rf $TIGER/${LION}/${RABBIT}/* and rm -rf $TIGER/${LION}/${RABBIT}?rm -rf $TIGER/${LION}/${RABBIT}/* 和 rm -rf $TIGER/${LION}/${RABBIT} 有什么区别?
【发布时间】:2014-06-26 10:49:41
【问题描述】:

我需要了解rm -rf $TIGER/${LION}/${RABBIT}/* and rm -rf $TIGER/${LION}/${RABBIT} 之间的差异,以便将其放入脚本中不会产生灾难,使其在未设置变量的情况下从根目录中删除所有内容。在 csh/ksh 中使用 rm -rf 的安全方法是什么?

感谢您的帮助!!

【问题讨论】:

  • 您的两个问题 - 如果未设置变量并理解这两个命令之间的区别是否安全 - 彼此没有任何关系。
  • ...顺便说一句——引号是你的朋友。如果这些变量中的任何一个包含空格,rm -rf "$tiger/$lion/$rabbit" 的错误就会减少。 (如果变量既不是 shell 内置变量也不是环境变量,则使用小写变量名更为传统)。
  • ...在此命令中$foo${foo} 之间根本没有有效区别;你可以忽略所有的花括号而不会造成任何伤害。
  • @CharlesDuffy,我认为如果未设置变量 rm -rf $TIGER/${LION}/${RABBIT}/* 结果 ///* 或 /* 从根中删除所有有权删除和 rm -rf $TIGER/${LION}/${RABBIT} 结果 rm -rf * 无论密码指向何处。你同意吗?
  • 不,我不同意。 rm -rf $TIGER/${LION}/${RABBIT} 产生rm -rf //,与rm -rf / 完全相同。另一个结果是rm -rf //*

标签: shell scripting ksh csh


【解决方案1】:

如果所有变量都未设置,这些命令中的任何一个都会造成灾难;它们的区别仅在于是删除目录本身还是删除目录中的非隐藏内容。

如果您想安全地避免从根目录中递归删除,请明确测试这种情况并取消:

[[ $TIGER && $LION && $RABBIT ]] || {
  echo "TIGER, LION and RABBIT must all be set; script exiting"
  exit 1
}
rm -rf ...

【讨论】:

    【解决方案2】:

    这会递归删除 所有非隐藏文件 ${RABBIT} 目录 - ${RABBIT} 目录不会被删除:

     rm -rf $TIGER/${LION}/${RABBIT}/* 
    

    注意隐藏文件(也称为点文件)的文件名以 . 开头。除非设置了 shell dotglob 选项,否则这些与典型的 * 扩展匹配。

    所以要删除所有文件(包括隐藏文件),您可以使用shopt,这样:

     shopt -s dotglob                   # turns shell option dotglob ON
     rm -rf $TIGER/${LION}/${RABBIT}/*  # Now deletes all (including hidden) files
     shopt -u dotglob                   # FYI - unsets or turns  dotglob OFF
    

    这会递归删除所有内容包括 ${RABBIT} 目录。

     rm -rf $TIGER/${LION}/${RABBIT}
    

    【讨论】:

    • 不是所有的东西,除非你的 shell 对从 glob 表达式中排除隐藏文件的支持被禁用。
    • Charles - 为回应您的信息性评论而编辑答案。
    【解决方案3】:

    将 /* 放在最后会删除该目录中的内容

    虽然只有“/”会删除目录本身以及其中的内容。

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 1970-01-01
      • 2011-02-28
      • 2012-07-02
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      相关资源
      最近更新 更多