更新

更新

我必须找到具有特定子文件夹的所有目录路径。

搜索模式如下:

find /foo/*/searched_folder/bar -maxdepth 0 -type d

̶i̶t̶'s̶s̶̶ ̶̶u̶s̶s̶e̶e̶t̶h̶i̶s̶s̶a̶l̶s̶s̶ ̶a̶r̶t̶。̶。 ̶f̶i̶r̶s̶t̶̶e̶n̶t̶r̶y̶,̶̶t̶h̶e̶̶p̶r̶o̶g̶r̶a̶m̶̶s̶t̶o̶p̶s̶̶s̶e̶a̶r̶c̶h̶i̶n̶g ̶a̶n̶d̶̶r̶e̶t̶u̶r̶n̶s̶̶o̶n̶l̶y̶̶o̶n̶e̶̶e̶n̶t̶r̶y̶。 I̶ ̶w̶a̶s̶ ̶t̶r̶y̶i̶n̶g̶ ̶t̶o̶ ̶u̶s̶e̶ ̶o̶p̶t̶i̶o̶n̶ -pruneb̶u̶t̶ ̶w̶i̶t̶h̶o̶u̶t̶ ̶s̶u̶c̶c̶e̶s̶s̶.̶ ̶I̶s̶ ̶t̶h̶e̶r̶e̶ ̶a̶n̶y̶ ̶e̶x̶t̶r̶a̶ ̶a̶r̶g̶u̶m̶e̶n̶t̶ ̶t̶o̶ ̶s̶e̶a̶r̶c̶h̶ ̶t̶h̶o̶s̶e̶ ̶f̶o̶l̶d̶e̶r̶ ̶p̶a̶t̶h̶s̶,̶ ̶o̶r̶ ̶m̶a̶y̶b̶e̶ ̶t̶h̶e̶r̶e̶ ̶i̶s̶ ̶s̶o̶m̶e̶ ̶o̶t̶h̶e̶r̶ ̶w̶a̶y̶ ̶t̶o̶ ̶s̶e̶a̶r̶c̶h̶ ̶i̶t̶?̶ ̶

我想找到与特定模式匹配的目录,并将其作为路径数组集成到 bash 脚本中。除了搜索之外,一切都已正常运行。

SORCE_ARRAY=($(find /projekte/*/$AB/software/software.git/ -maxdepth 0 -type d))

真实例子

find /projekte/*/3140/software/software.git/ -maxdepth 0 -type d

新版本(openSUSE Tumbleweed):

/projekte/ABBA/3140/software/software.git/
/projekte/JERRY/3140/software/software.git/
/projekte/LED/3140/software/software.git/

旧版本(openSUSE Leap 15.1):

/projekte/ABBA/3140/software/software.git/

更新

问题是软链接。 Linux openSUSE Tumbleweed 上的结构不区分它是软链接还是服务器上的常规文件夹。本以为存在3个文件夹,结果最后两个结果是软链接。

同时,在 openSUSE Leap 上是一个不同的问题。首先,几乎所有真实的文件夹都是第一个,所以我认为 find 不会进一步查找。其次,在服务器上,软链接中的路径看起来不像:

/projekte/*/3140/software/software.git/

但:

/projects/*/3140/software/software.git/

这对于所有系统程序都是不可读的(不仅仅是“查找”)。

结论是这样的:

  • Tumbleweed 不显示该文件夹是软链接还是文件夹
  • Leap无法正确解释软链接

我仍然不知道如何将这两件事结合在一起。

答案1

要查找与模式匹配的所有名称/projekte/*/3140/software/software.git/,您可以这样做

set -- /projekte/*/3140/software/software.git/

然后,这些名称可在位置参数中使用:

for gitdir do
    printf 'Found directory %s\n' "$gitdir"
done

要不就

printf 'Found directory %s\n' "$@"

这将打印找到的目录的名称。如果任何名称是目录的符号链接,则将遍历该符号链接。

如果您需要将它们分配给例如中的命名数组bash

set -- /projekte/*/3140/software/software.git/
SORCE_ARRAY=( "$@" )

要不就

SORCE_ARRAY=( /projekte/*/3140/software/software.git/ )

这是优于扩展命令替换的首选方法,因为命令替换不会保留文件名中的空格。

唯一的问题是模式是否不匹配任何事物在这种情况下,该模式将保持未展开状态。要使不匹配的模式完全扩展为空,请shopt -s nullglob在 shell 中使用bash

答案2

head您应该通过管道来使用该命令find,如下所示find /foo/*/searched_folder/bar -maxdepth 0 -type d | head -n 1:这只会得到第一个结果。

相关内容