Unix "find"命令用法



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

脚本:foo.sh in brief.

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,我需要在查找命令中使用reg exp,以微调删除以解决目录冲突。

修改了上面脚本的查找部分如下

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

新用法:foo.sh TEST_2B/TEST_3

但是"find"命令无法将DIR设置为<$HOME>/TEST/TEST_1B/TEST_2B/TEST_3,而是返回空的&因此DIR是空的,我永远不能删除<$HOME>/TEST/TEST_1B/TEST_2B/TEST_3

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

你可以试试:

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 -type d -name $1 -exec echo {} ';'  -exec rm -rf {} ';'

它会提示删除已处理的目录,但除了一些错误输出外,它还可以…

您可以更改"-name"为"-regexp",如您所建议的,但如果您想要更复杂的东西,您可以创建特殊的脚本从"-exec"调用

编辑:我可能第一次理解错了你(但不会删除任何东西,它可能会帮助别人)-你只想删除TEST_3目录中的一个(你如何选择哪一个?首先被发现的是什么?-这似乎很奇怪),仍然正如我在前一段中建议的,你可以提供脚本到-exec,它将照顾所有的决策)