Unix“查找”命令用法

时间:2011-10-27 21:58:05

标签: regex bash find

这是针对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

但是“找到”命令FAILS将DIR设置为<$HOME>/TEST/TEST_1B/TEST_2B/TEST_3,而是返回空&amp;结果DIR为空,我永远不会删除<$HOME>/TEST/TEST_1B/TEST_2B/TEST_3

如何更改脚本,以便find可以在JUST上执行目录名称,也可以在没有问题的情况下执行目录路径。事实上,一些用户可能会将部分目录路径作为“foo.sh”的参数。我希望“foo.sh”能够工作,即使在这种情况下也是如此

2 个答案:

答案 0 :(得分: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。这将处理(部分)目录名称。

答案 1 :(得分:0)

这不会按预期工作吗?

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

它会抱怨删除已处理的目录,但是比某些stderr输出还要好......

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

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