質問
Linuxで、子供を繰り返すことなく、フォルダーにサブフォルダーがあるかどうかを確認しようとしています。私がこれまでに見つけた最も近いのは使用されています ftw
最初のサブフォルダーで停止 - または使用します scandir
結果をフィルタリングします。どちらも、私の目的のための過剰なものであり、私は単にyes/noが欲しいだけです。
Windowsでは、これは呼び出しによって行われます SHGetFileInfo
そして、テスト dwAttributes & SFGAO_HASSUBFOLDER
返された構造について。 Linuxにそのようなオプションはありますか?
解決
標準的な答えは、呼び出すことです 統計 ディレクトリで、st_nlinkフィールド(「ハードリンクの数」)を確認します。標準ファイルシステムでは、各ディレクトリには2つのハードリンクがあることが保証されています(.
親ディレクトリから現在のディレクトリへのリンク)。したがって、2を超える各ハードリンクはサブディレクトリ(具体的にはサブディレクトリのものを示します。 ..
現在のディレクトリへのリンク)。
ただし、これを実装するためにファイルシステムが必要ないことは私の理解です(例: このメーリングリストの投稿)、したがって、機能することは保証されていません。
そうでなければ、あなたがしているようにしなければなりません:
他のヒント
あなたが言及した可能性(および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ボックスにアクセスすることなく一時的に:(