find
なんかこう、ひとこと書きたくなるという点で PyTest さんは良いな。
まぁ、Ruby ならもっと簡単。shiro さんのコメントの通りというか PyTest さんも思っているようだが、言語云々よりライブラリの話だなぁ。
% ruby -rfind -e "Find.find('.') {|path| puts path}"
ついでに言えば無理やり map を使っているので、無駄なリストが生成されるのが気にならないでもない。そもそも、1行でということ自体にあまり意味はないのであるが。
あとまぁ、関数プログラミング的な話で言えば、ツリーを traverse する高階関数を用意するとかのほうがいいのではないかと思った。この変は generator とか遅延評価とかあると多少やりやすい。
import sys import os def traverse(obj, enum): yield obj for child in enum(obj): for element in traverse(child, enum): yield element def find(path): def enum(path): if os.path.isdir(path): return [os.path.join(path, child) for child in os.listdir(path)] else: return () return traverse(path, enum) if __name__ == '__main__': if len(sys.argv) > 1: path = sys.argv[1] else: path = os.getcwd() for e in find(path): print e
あぁ、今気づいたが、ディレクトリがリストアップされないという点においてそれ find 違うというツッコミもあるな。