お気に入りの言語でディレクトリツリーをどのようにトラバースしますか?
さまざまなオペレーティングシステムでディレクトリツリーをトラバースするには、何を知っておく必要がありますか?別のファイルシステムで?
ディレクトリツリーのトラバースを支援するためのお気に入りのライブラリ/モジュールは何ですか?
お気に入りの言語でディレクトリツリーをどのようにトラバースしますか?
さまざまなオペレーティングシステムでディレクトリツリーをトラバースするには、何を知っておく必要がありますか?別のファイルシステムで?
ディレクトリツリーのトラバースを支援するためのお気に入りのライブラリ/モジュールは何ですか?
Pythonの場合:
迅速でクリーンでポータブルなソリューションを探している場合は、次を試してください。
import os
base_dir = '.'
def foo(arg, curr_dir, files):
print curr_dir
print files
os.path.walk(base_dir, foo, None)
名前を出力するだけでなく、他のことを行うように foo を変更できることに注意してください。さらに、Python 3.0 への移行に関心がある場合は、代わりに os.walk() を使用する必要があります。
Javaの場合:
ここで再帰が役に立ちます。以下は、何年にもわたってインターネット上で広まっている Java コード スニペットです。誰がその功績に値するかわかりません。
// Process all files and directories under dir
public static void visitAllDirsAndFiles(File dir) {
process(dir); //do something useful with the file or dir
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i=0; i<children.length; i++) {
visitAllDirsAndFiles(new File(dir, children[i]));
}
}
}
bash:
#!/bin/bash
function walk_tree {
echo "Directory: $1"
local directory="$1"
local i
for i in "$directory"/*;
do
echo "File: $i"
if [ "$i" = . -o "$i" = .. ]; then
continue
elif [ -d "$i" ]; then # Process directory and / or walk-down into directory
# add command here to process all files in directory (i.e. ls -l "$i/"*)
walk_tree "$i" # DO NOT COMMENT OUT THIS LINE!!
else
continue # replace continue to process individual file (i.e. echo "$i")
fi
done
}
walk_tree $HOME
(http://ubuntuforums.org/showthread.php?t=886272コメント#4から採用)
C # の場合:
Stack<DirectoryInfo> dirs = new Stack<DirectoryInfo>();
dirs.Push(new DirectoryInfo("C:\\"));
while (dirs.Count > 0) {
DirectoryInfo current = dirs.Pop();
// Do something with 'current' (if you want)
Array.ForEach(current.GetFiles(), delegate(FileInfo f)
{
// Do something with 'f'
});
Array.ForEach(current.GetDirectories(), delegate(DirectoryInfo d)
{
dirs.Push(d);
});
}
C++
#include <utility>
#include <boost/filesystem.hpp>
#include <boost/foreach.hpp>
#define foreach BOOST_FOREACH
namespace fs = boost::filesystem;
fs::recursive_directory_iterator it(top), eod;
foreach (fs::path const & p, std::make_pair(it, eod)) {
if (is_directory(p)) {
...
} else if (is_regular_file(p)) {
...
} else if (is_symlink(p)) {
...
}
}
Linux で GNU ツールを使用する場合
find -print0 | xargs -0 md5sum
また
find -print0 | xargs -0 -iASD echo 'this file "ASD" should be dealt with lile this (ASD)'
うーん、再帰を伴う C# .....
public static List<string> CrawlPath(string path, bool IncludeSubFolders)
{
List<string> fileList = new List<string>();
try
{
Stack<string> filez = new Stack<string>(Directory.GetFiles(path));
while (filez.Count > 0)
{
fileList.Add(filez.Pop());
}
if (IncludeSubFolders)
{
filez = new Stack<string>(Directory.GetDirectories(path));
while (filez.Count > 0)
{
string curDir = filez.Pop();
fileList.AddRange(CrawlPath(curDir, IncludeSubFolders));
}
}
}
catch (System.Exception err)
{
Console.WriteLine("Error: " + err.Message);
}
return fileList;
}