修正する

修正する

特定のサブフォルダーがあるすべてのディレクトリパスを見つける必要があります。

検索パターンは次のとおりです。

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

―i―t―の―s――――u―s―s―e―e―t―h―i―s―s―a―l―s―s―a―r―t―。 ―。 ―firstentry-,--theprogramstopssearch-ingan r ut 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つあると思いましたが、最後の2つの結果がソフトリンクでした。

一方、openSUSE Leapには他の問題があります。まず、ほぼすべての実際のフォルダが最初であるため、findはもはや検索されないようです。第二に、サーバー上のソフトリンクのパスは次のとおりです。

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

しかし:

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

これは、すべてのシステムプログラム(「検索」だけでなく)から読み取ることはできません。

結論はこうです。

  • Tumbleweedは、そのフォルダがソフトリンクかフォルダなのかを表示しません。
  • Leapはソフトリンクを正しく解釈できません。

私はまだこの2つをどのように組み合わせるべきかわかりません。

ベストアンサー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シェルでを使用してくださいbash

おすすめ記事