質問

Linuxで、子供を繰り返すことなく、フォルダーにサブフォルダーがあるかどうかを確認しようとしています。私がこれまでに見つけた最も近いのは使用されています ftw 最初のサブフォルダーで停止 - または使用します scandir 結果をフィルタリングします。どちらも、私の目的のための過剰なものであり、私は単にyes/noが欲しいだけです。

Windowsでは、これは呼び出しによって行われます SHGetFileInfo そして、テスト dwAttributes & SFGAO_HASSUBFOLDER 返された構造について。 Linuxにそのようなオプションはありますか?

役に立ちましたか?

解決

標準的な答えは、呼び出すことです 統計 ディレクトリで、st_nlinkフィールド(「ハードリンクの数」)を確認します。標準ファイルシステムでは、各ディレクトリには2つのハードリンクがあることが保証されています(. 親ディレクトリから現在のディレクトリへのリンク)。したがって、2を超える各ハードリンクはサブディレクトリ(具体的にはサブディレクトリのものを示します。 .. 現在のディレクトリへのリンク)。

ただし、これを実装するためにファイルシステムが必要ないことは私の理解です(例: このメーリングリストの投稿)、したがって、機能することは保証されていません。

そうでなければ、あなたがしているようにしなければなりません:

  1. 使用を使用してディレクトリのコンテンツを反復します グローブ GNU固有の GLOB_ONLYDIR 旗、または スカンダル, 、 また readdir.
  2. 電話 統計 各結果とチェック S_ISDIR(s.st_mode) 見つかったファイルがディレクトリであることを確認するために。または、おそらく、チェックしてください struct dirent.d_type: : もし DT_DIR それからそれはファイルであり、それが DT_UNKNOWN, 、結局のところそれを統計する必要があります。

他のヒント

あなたが言及した可能性(およびE.Jamesのもの)は、C ++プログラムよりもシェルスクリプトにより適しているように思えます。 「C ++」タグは意図的であると仮定することは、おそらくPOSIX APIを直接使用する方が良いと思います。

// warning: untested code.
bool has_subdir(char const *dir) { 
    std::string dot("."), dotdot("..");
    bool found_subdir = false;    
    DIR *directory;

    if (NULL == (directory = opendir(dir)))
        return false;

    struct dirent *entry;
    while (!found_subdir && ((entry = readdir(directory)) != NULL)) {
        if (entry->d_name != dot && entry->d_name != dotdot) {
            struct stat status;
            stat(entry->d_name, &status);
            found_subdir = S_ISDIR(status.st_mode);
        }
    }
    closedir(directory);
    return found_subdir;
}

します getDirentries あなたにそれをしたいですか?ディレクトリがなければ、何も戻ってこないと思います。私はこれを自分で試していましたが、Linuxボックスにアクセスすることなく一時的に:(

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top