BASH:排除"找到"中的目录。命令

时间:2014-04-28 15:27:25

标签: bash find

我想使用find命令排除目录。

我有这个:

GLUE="$GLUE -not -iwholename */dir3/*"

我想在GLUE命令(find)中使用find $GLUE [...]变量。不幸的是,我-not -iwholename */dir3/*代替GLUE而不是-not -iwholename dir3/file1 dir3/file2 dir3/file3,即*/dir3/*变成符合此条件的文件名。当然,find因此而无效。怎么阻止?

2 个答案:

答案 0 :(得分:2)

find ./ -iname ! -iname <dirname of file name to be not part of search results>

find ./ -iname <file name> ! -path "./dirt o be Excluded/*" 

我希望有人帮忙

答案 1 :(得分:2)

让我先回答这个问题:

  

如何在从搜索中排除目录时使用find递归搜索?我的find命令支持-prune操作和公共扩展(例如,由GNU find提供)。

您很幸运,find支持-prune行动。恭喜!

在这种情况下,只需添加:

\! \( -name 'dir_to_exclude' -prune \)

如果find处理的当前名称为dir_to_exclude,并且同时从搜索树 1 修剪(即剪切该分支),则此值为false

试试吧(在暂存目录中):

$ mkdir {a,b,c,d}/{,1,2,3}
$ touch {a,b,c,d}/{,1,2,3}/{file1,file2}
$ tree
.
|-- a
|   |-- 1
|   |   |-- file1
|   |   `-- file2
|   |-- 2
|   |   |-- file1
|   |   `-- file2
|   |-- file1
|   `-- file2
|-- b
|   |-- 1
|   |   |-- file1
|   |   `-- file2
|   |-- 2
|   |   |-- file1
|   |   `-- file2
|   |-- file1
|   `-- file2
`-- c
    |-- 1
    |   |-- file1
    |   `-- file2
    |-- 2
    |   |-- file1
    |   `-- file2
    |-- file1
    `-- file2

9 directories, 18 files
$ find \! \( -name a -prune \)
.
./b
./b/file2
./b/1
./b/1/file2
./b/1/file1
./b/file1
./b/2
./b/2/file2
./b/2/file1
./c
./c/file2
./c/1
./c/1/file2
./c/1/file1
./c/file1
./c/2
./c/2/file2
./c/2/file1

看起来不错!


现在,您不应该将您的参数放在变量中find(或者更常见的是您的命令和参数),而是将放入数组中!如果你不是很快就会遇到包含空格的参数的问题,或者像你的OP中那样遇到通配符。

将您的glue内容放入数组中:例如,查找名称中包含1并且为空 2 的所有文件:

glue=( '-name' '*1*' '-type' 'f' '-empty' )

然后的数组排除此目录

exclude_dir=( '!' '(' '-name' 'a' '-prune' ')' )

然后查找名称中包含1并且为空的所有文件,同时排除目录a(与之前相同的临时目录中):

$ find "${exclude_dir[@]}" "${glue[@]}"
./b/1/file1
./b/file1
./b/2/file1
./c/1/file1
./c/file1
./c/2/file1

看起来真的好! (并观察报价!)。


1 如果您确实希望确保仅排除名称为dir_to_exclude的目录,以防您有一个名为dir_to_exclude的文件,则可以这样指定:

\! \( -name 'dir_to_exclude' -type d -prune \)

2 我在这里使用了很多引号。只是一个好习惯,实际上可以节省我的通配符部分*1*和括号!