1.2.21 • Published 3 months ago
nd-fast-walk-dir v1.2.21
nd-fast-walk-dir
- fast recusive walk dir: about 360000 paths per/second, recursive walk the whole "/" cost 2.5 - 3.5 second (based on your CPU/DISK)
- 5 times faster than fs.readdirSync
- only work for linux
need g++-14 installed
install
- npm install nd-fast-walk-dir
RESTRICT
- this script SOMETIMES can NOT correctly walk /run/systemd/incoming AND /var/tmp
usage
const walk = require("nd-fast-walk-dir");
example
simple walk only for path
these methods:
will ONLY just search one hardlink of a inode (IF multiple hardlinks other than .|.. exists)
are slightly faster than non-simple-methods
cost much less memory than non-simple-methods
using ftype_t = "dire" | "file" | "link" | "sock" | "fifo" | "char" | "blok";
xxxx : "dire" | "file" | "link" | "sock" | "fifo" | "char" | "blok"
list_all_[@xxxx] : (
dir_name : String,
filter : (type: ftype_t, full_path:String) -> Boolean
)->Array<String>
var files = walk.list_all_file("/",(full_path)=>true)
var dires = walk.list_all_dire("/",(full_path)=>true)
var links = walk.list_all_link("/",(full_path)=>true) // soft-link NOT hard-link
var socks = walk.list_all_sock("/",(full_path)=>true)
var fifos = walk.list_all_fifo("/",(full_path)=>true)
var chars = walk.list_all_char("/",(full_path)=>true)
var bloks = walk.list_all_blok("/",(full_path)=>true)
.list_all_paths_of_type(
dir_name : String,
type : ftype_t
filter : (full_path:String) -> Boolean
) -> Array<String>
.path_only_walk(
dir_name : String,
filter : (type: ftype_t, full_path:String) -> Boolean,
) -> Array<Tuple[2]<ftype_t,String>>
.gen_path_only_walk(
dir_name : String,
filter : (type: ftype_t, full_path:String) -> Boolean,
enableHugeCount : false , // if your files exceed 2**32 , set this to true: false: will using Uint32Array , true: will using BigUint64Array
)->SyncGenerator<Tuple[2]<ftype_t,String>>;
SLOW verbosed GRAPH BUILDER : detailed_sync_snapshot_graph
this will make a GRAPH from filesystem:
it will keep all hard-links
keep soft-link-to
build-and-keep soft-links-from
IF the soft-link-to IS external of the-walking-dir :
for example:
your walk "/home/data"
/home/data/softlink pointer to /root/something
it will just keep a string "/root/something"
ELSE it will keep a GraphUnit
the GRAPH is READONLY
examples:
var rt = walk.detailed_sync_snapshot_graph("/");
> rt.fs
FileSystemGraphUnitSnapShot [/ ::
run
var
mnt
lost+found
lib.usr-is-merged
sbin.usr-is-merged
.....
bin -> usr/bin
swap.img
etc
] {
cnt: 1149087,
graph_unit_vec_offset: 48,
chid_vec_offset: 55156224,
name_buffer_offset: 59752568,
dir_name: '/'
}
> rt
[/ ::
run
var
mnt
lost+found
lib.usr-is-merged
sbin.usr-is-merged
....
lib64 -> usr/lib64
bin -> usr/bin
swap.img
etc
] {}
>
> rt.type
'dire'
> rt.hlinks.map(r=>r.path)
[
'/',
'/run/initramfs',
'/dev/rfkill',
'/sys/fs',
'/run/lock/lvm',
.....
'/snap/snapd/23258/etc/apparmor.d',
'/proc/sys/fs/binfmt_misc/status'
]
> rt.lnfrs.map(r=>r.path)
[
'/proc/1/cwd', '/proc/1/root', '/proc/2/cwd', '/proc/2/root',
'/proc/3/cwd', '/proc/3/root', '/proc/4/cwd', '/proc/4/root',
.....
'/proc/58/cwd', '/proc/58/root', '/proc/59/cwd', '/proc/59/root',
'/proc/60/cwd', '/proc/60/root', '/proc/61/cwd', '/proc/61/root',
'/proc/62/cwd', '/proc/62/root', '/proc/63/cwd', '/proc/63/root',
... 1021 more items
]
>
.detailed\_sync\_snapshot\_graph(
dir\_name : String,
BuildRelationAfterCtor =true // IF set this to False , it will be much faster, BUT can NOT resolve soft-link-to/soft-link-from/all-hard-links
)-\><GraphUnit>
GraphUnit:
.fs @getter -> <FileSystemGraphUnitSnapShot>
.type @getter -> ftype_t
.is_leaf @getter -> Boolean // NOT-DIRECTORY OR Empty-Directory
.id @getter -> Integer
.chcnt @getter -> Integer
.depth @getter -> Integer
.hlink_cnt @getter -> Integer // st_nlink hard-link-count(NOT include . AND ..)
.ino @getter -> Integer // real-fs-inode
.lno @getter -> Integer // real-fs-soft-link-to-inode
.slink_from_cnt @getter -> Integer
.name @getter -> String
.path @getter -> String
.pr @getter -> <GraphUnit> |Null //parent null means relative root
.children @getter -> Array<GraphUnit>
.hlinks @getter -> Array<GraphUnit|Undefined> //Undefined means some error happened
.slink @getter -> <GraphUnit> | String@LinkToExternal | Undefined // soft-link-to
.slinks_from @getter -> Array<GraphUnit> // soft-link-from NOT include external-link-from
.get_brief_str() -> String //readable string
.child(AryIndex|String) -> <GraphUnit> | Null
.json() -> JSON // this is slow: recursive build to json
FileSystemGraphUnitSnapShot: its a array buffer:
cnt;
graph_unit_vec_offset;
chid_vec_offset;
name_buffer_offset;
dir_name
fast walk return a array
var all = walk(
"/", //directory to walk
(type,full\_path,rel\_depth)=\>true, //filter function
{
max\_rel\_depth: 2048 , // MAX relative depth to directory to walk, default is 2048
IgnoreProcDevRunTmpSys:true, // ignore /proc AND /dev AND /run AND /tmp AND /var/tmp
IgnoreSockFifoCharBlok:true // ignore SOCK | FIFO | CHAR-DEV | BLOCK-DEV
}
)
console.log(all.length)
console.log(all[1000000])
/*
[
'file', // type <- "file" | "dire" | "link" | "sock" | "fifo" | "char" | "blok"
'/home/cu-lib/GCC13GIT/gcc-13.2.0/gcc/testsuite/gcc.target/arm/mve/intrinsics/viwdupq\_m\_n\_u8.c', //【full path】
10
]
*/
slow detailed graph walk
//---this will include parent AND link-to AND inode infomation
//---it will ignore /proc AND /dev AND /run AND /tmp AND /var/tmp
//---it will skip all sock | fifo | char-dev | blk-dev, only keep file AND directory AND soft-link
//---it will return a group of functions
//---it is slow: need about 10 seconds to walk the whole "/" AND build graph snapshot
walk.sync_snapshot_graph(dir_name="./",max_depth=2048) -> {
list_all_paths: [Function: list_all_paths],
list_all_inodes: [Function: list_all_inodes],
list_all_types: [Function: list_all_types],
list_all_rel_depths: [Function: list_all_rel_depths],
list_show: [Function: list_show],
ind: [Function: ind],
fpath: [Function: fpath],
pn: [Function: pn],
type: [Function: type],
parent: [Function: parent],
children: [Function: children],
get_linkto: [Function: children],
foreach: [Function: foreach],
filter: [Function: filter]
}
METHODS
walk.sync_snapshot_graph(dir_name="./",max_depth=2048) -> {
list_all_paths: [Function: list_all_paths],
list_all_inodes: [Function: list_all_inodes],
list_all_types: [Function: list_all_types],
list_all_rel_depths: [Function: list_all_rel_depths],
list_show: [Function: list_show],
ind: [Function: ind],
fpath: [Function: fpath],
pn: [Function: pn],
type: [Function: type],
parent: [Function: parent],
children: [Function: children],
get_linkto: [Function: children],
foreach: [Function: foreach],
filter: [Function: filter]
}
CONSTS
type name:
fifo
char
dire
blok
file
link
sock
APIS
(
dir_name="./",
fltr_func=(type,full_path,rel_depth)=>true,
cfg = {
max_rel_depth:2048, // dir_name IS 0
IgnoreProcDevRunTmpSys:true, // ignore /proc AND /dev AND /run AND /tmp AND /var/tmp
IgnoreSockFifoCharBlok:true // ignore SOCK | FIFO | CHAR-DEV | BLOCK-DEV
}
) -> Array< [type:FixedString, path:String, relative_depth:UInt]>
LICENSE
- ISC
1.2.21
3 months ago
1.2.20
3 months ago
1.2.19
3 months ago
1.2.18
3 months ago
1.2.17
3 months ago
1.2.16
3 months ago
1.2.15
3 months ago
1.2.14
4 months ago
1.2.13
4 months ago
1.2.12
4 months ago
1.2.11
4 months ago
1.2.10
4 months ago
1.2.9
4 months ago
1.2.8
4 months ago
1.2.6
4 months ago
1.2.4
4 months ago
1.2.3
4 months ago
1.2.2
4 months ago
1.2.1
4 months ago
1.2.0
4 months ago
1.1.12
4 months ago
1.1.11
4 months ago
1.1.9
4 months ago
1.1.7
4 months ago
1.1.5
4 months ago
1.1.3
4 months ago
1.1.2
4 months ago
1.1.1
4 months ago
1.1.0
4 months ago
1.0.2
4 months ago
1.0.6
5 months ago
1.0.5
5 months ago
1.0.4
5 months ago
1.0.1
5 months ago
1.0.0
5 months ago