[Raku] 如何列舉出某目錄底下所有檔案
作者:gugod 發佈於: #rakulang拜訪指定目錄、深入其底下所有子目錄、列舉出其中所有檔案。這個題目常是我在學習新的程式語言時的基本練習題。
我自做了一個自認實用的版本: fl。程式全文如下:
#!/usr/bin/env raku
my %IGNORE = (
"node_modules" => 1,
".git" => 1,
);
sub find-files($dir) {
dir($dir).flatmap(-> $p {
if $p.f {
$p.path
} elsif $p.d && ! %IGNORE{$p.basename} {
find-files($p.path)
}
});
}
my $start_dir = @*ARGS[0] // ".";
.say for find-files($start_dir);
用例如下:
fl
fl ~/src
如果不給參數,就以目前所在目錄做為參數。基本上這指令等價於:
find . -type f | grep -vE '(\.git|node_modules)/'
由於 .git
跟 node_modules
底下通常不會有甚麼有用的資訊,所以預設為忽略。
與 RosettaCode/Walk a directory/Recursively #Raku 上以 gather/take 語法寫成的版本比較,我所做的這版似乎稍微快一些些。以走完我的 ~/src
來測試的話,兩版都正確地印出了 211770 列文字,測試第一輪時,RosettaCode 上的版本費 30 秒、我的版本費 25 秒。第二輪的結果分別為 32 秒與 26 秒。
若要更快,或許可以改為非遞迴版、並輔以 hyper/race 關鍵字,讓其使用多 CPU。