【问题标题】:Unix "find" command usageUnix“查找”命令用法
【发布时间】:2011-12-16 21:36:57
【问题描述】:

这是一个 bash 安装脚本。脚本 foo.sh 将“DIRECTORY”作为参数。比如说,有一个目录<$HOME>/TEST/TEST_1A/TEST_2A/TEST_3 和另一个目录<$HOME>/TEST/TEST_1B/TEST_2B/TEST_3

脚本:foo.sh 简介。

DIR='find $HOME -type d -name $1 | head 1'
if [ DIR is set to a directory ]
then
   rm -rf $DIR
fi
exit 0

用法:foo.sh TEST_3

现在从脚本中,只能删除 <$HOME>/TEST/TEST_1A/TEST_2A/TEST_3。要删除 <$HOME>/TEST/TEST_1B/TEST_2B/TEST_3,我需要在我的 find 命令中使用 reg exp 来微调删除以解决目录冲突。

将上述脚本的查找部分修改如下

DIR='find $HOME -type d -regexp $1 | head 1'

新用法:foo.sh TEST_2B/TEST_3

但是“查找”命令无法将 DIR 设置为 <$HOME>/TEST/TEST_1B/TEST_2B/TEST_3 而是返回空 & 结果 DIR 是空的,我永远无法删除 <$HOME>/TEST/TEST_1B/TEST_2B/TEST_3

如何更改脚本,以便 find 可以仅对目录名称以及目录路径进行操作,而不会出现任何问题。事实上,一些用户可能会将部分目录路径作为“foo.sh”的参数。我希望“foo.sh”能够工作,即使在这种情况下

【问题讨论】:

  • 请发布 bash 脚本的源代码。我写了很多相当基本的脚本,尽管很长。没有什么比回应你的论点更有帮助了。

标签: regex bash find


【解决方案1】:

这不会按预期工作吗?

find $HOME -type d -name $1 -exec echo {} ';'  -exec rm -rf {} ';'

它会抱怨删除已处理的目录,但除了一些 stderr 输出它还可以......

您可以按照您的建议将“-name”更改为“-regexp”,但如果您想要更复杂的内容,您可以创建特殊脚本以从“-exec”调用

编辑: 我可能第一次理解错了(但不会删除任何东西,它可能会对某人有所帮助) - 你只想删除 TEST_3 目录中的一个(你如何选择哪个?首先通过 find 找到? - 看起来很奇怪),仍然正如我在上一段中建议的那样,您可以向 -exec 提供脚本,它将负责所有决策)

【讨论】:

  • 凭借“find”输出和“foo.sh TEST_3”,它总是会被 /TEST/TEST_1A/TEST_2A/TEST_3 删除。如果我适当地更改我的“查找”参数以支持部分路径,那么“foo.sh TEST_2B/TEST_3”应该删除 TEST_2B/TEST_3
【解决方案2】:

你可以试试:

if [[ "$1" == */* ]]; then
    EXPR="-path *$1"
else
    EXPR="-name $1"
fi
DIR=$(find $HOME -type d $EXPR | head -1)

像“TEST_3”这样的简单名称将转换为find -name TEST_3,但像“ST_2/TEST_3”这样带有斜线的名称将转换为find -path *ST_2/TEST3。这将处理(部分)目录名称。

【讨论】:

  • 我在此处查找时遇到问题。我认为“查找”部分路径存在问题。例如, find $(HOME) -path *ST_2B/TEST_3 有效,但 find $(HOME) -path TEST_2B/TEST_3 没有任何结果。奇怪的。我也必须支持部分路径,“查找”解析路径然后删除它
  • @Mike:Find 没有问题,只是你的期望是错误的。 -pathcomplete 路径与给定模式进行了比较。因此,xyz/TEST_2B/TEST_3 与您的论点 TEST_2B/TEST3 进行比较,这显然是不匹配的。与 */TEST_2B/TEST_3 相比,它 IS 匹配。关于“部分匹配”:如果我的答案不是您想要的,请通过编辑在问题中澄清这一点。答案中的长时间讨论不受欢迎 - 请参阅常见问题解答。
  • 根据您的第二个解释,我得到了 -path 的期望并且它对我有用。非常感谢
  • 不客气。请查找stackoverflow.com/faq#howtoask如何投票并接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 2015-04-18
相关资源
最近更新 更多