


Alphabetically list all vanilla names (names not starting with a dot) in current directory:
eval: foreach (dir::entry_names ".") .{ printf "%s\n" #filename; };
bar
foo
zot
Alphabetically list all names in current directory, except for “.” and “..”:
eval: foreach (dir::entry_names' ".") .{ printf "%s\n" #filename; };
.bashrc
.emacs
bar
foo
src
zot
Alphabetically list all filenames in current directory, including “.” and “..”:
eval: foreach (dir::entry_names'' ".") .{ printf "%s\n" #filename; };
.
..
.bashrc
.emacs
bar
foo
src
zot
Alphabetically list names of all vanilla files in current directory, ignoring directories, pipes etc:
eval: foreach (dir::file_names ".") .{ printf "%s\n" #filename; };
.bashrc
.emacs
bar
foo
zot
Count number of entries in current directory:
eval: length (dir::entry_names'' ".");
7
Alphabetically list paths of all vanilla names in current directory:
eval: foreach (dir::entries ".") .{ printf "%s\n" #filename; };
/home/jcb/bar
/home/jcb/foo
/home/jcb/src
/home/jcb/zot
Alphabetically list paths of all names in current directory except for “.” and “..”:
eval: foreach (dir::entries' ".") .{ printf "%s\n" #filename; };
/home/jcb/.bashrc
/home/jcb/.emacs
/home/jcb/bar
/home/jcb/foo
/home/jcb/src
/home/jcb/zot
Alphabetically list paths of all names in current directory, including “.” and “..”:
eval: foreach (dir::entries'' ".") .{ printf "%s\n" #filename; };
/home/jcb/.
/home/jcb/..
/home/jcb/.bashrc
/home/jcb/.emacs
/home/jcb/bar
/home/jcb/foo
/home/jcb/src
/home/jcb/zot
Alphabetically list paths of all vanilla files in current directory, ignoring directories, pipes etc:
eval: foreach (dir::files ".") .{ printf "%s\n" #filename; };
/home/jcb/.bashrc
/home/jcb/.emacs
/home/jcb/bar
/home/jcb/foo
/home/jcb/zot
Print the sizes and names of all vanilla files in current directory:
eval: foreach (dir::file_names ".") .{ printf "%8d %s\n" (stat #filename).size #filename; };
328 .bashrc
240553 .emacs
29559 bar
24963 foo
124518 zot
Build a list of (filename, filesize) pairs for current directory:
eval: pair_list = map .{ (#name, (stat #name).size); } (dir::file_names ".");
[(".bashrc", 328),
("bar", 29559), ("foot", 24963),
("zot", 126542)]
Build a list of (filename, filesize) pairs for current directory II:
eval: [ (filename, (stat filename).size) for filename in dir::file_names "." ];
[(".bashrc", 328),
("bar", 29559), ("foot", 24963),
("zot", 126542)]
Sort the above list by size:
eval: sorted_list = sort .{ #2 #a < #2 #b; } pair_list;
[(".emacs", 240547), ("zot", 126542),
("bar", 29559), (".bashrc", 328)]
Print above size-sorted list:
eval: apply .{ printf "%8d %s\n" (#2 #a) (#1 #a); } sorted_list;
240547 .emacs
126542 zot
29559 bar
328 .bashrc
Print names of the immediate subdirectories of the current directory:
eval: foreach (dir::entry_names ".") .{ if (-D #name) printf "%s\n" #name; fi; };
src
Print names of all files matching a given regular expression:
eval: foreach (dir::file_names ".") .{ if (#name =~ ./o/) printf "%s\n" #name; fi; };
foo
zot
Build a map from file names to file sizes, then print it out:
#!/usr/bin/mythryl
include string_map;
# Build a string-map (balanced binary tree)
# where the keys are the file names and the
# values are the file sizes:
#
name_to_size
=
for (result = empty, input = dir::file_names ".";
length input > 0; input = tail input;
result
)
{ name = head input;
result $= (name, (stat name).size);
};
# Iterate over all keys in the map, fetching
# corresponding sizes and printing the two out:
#
foreach (keys_list name_to_size) .{
size = the (get (name_to_size, #name));
printf "%8d %s\n" size #name;
};
exit 0;
List all plain files in or below current directory:
eval: foreach (dir_tree::files ".") .{ printf "%s\n" #file; };
/home/jcb/.bashrc
/home/jcb/.emacs
/home/jcb/bar
/home/jcb/foo
/home/jcb/src/test.c
/home/jcb/zot
List sizes of all plain files in or below current directory:
eval: foreach (dir_tree::files ".") .{ printf "%8d %s\n" (stat #file).size #file; };
328 /home/jcb/.bashrc
240553 /home/jcb/.emacs
29559 /home/jcb/bar
24963 /home/jcb/foo
1978 /home/jcb/src/test.c
124518 /home/jcb/zot
Count number of plain files in or below current directory:
eval: length (dir_tree::files ".");
6
Print all .c files in or below current directory:
eval: foreach (dir_tree::files ".") .{ if (#file =~ ./\\.c$/) printf "%s\n" #file; fi; };
/home/jcb/src/test.c
Print all .c files in or below current directory, another way:
eval: foreach (filter .{ #file =~ ./\\.c$/; } (dir_tree::files ".")) .{ printf "%s\n" #file; };
/home/jcb/src/test.c
Count number of .c files in or below current directory:
eval: length (filter .{ #file =~ ./\\.c$/; } (dir_tree::files "."));
1
Two equivalent ways to count the number of directories in or below a directory:
eval: length (filter .{ isdir #file; } (dir_tree::entries' "."));
1
eval: length (filter .{ -D #file; } (dir_tree::entries' "."));
To count other things, you can replace isdir above by one of ispipe, issymlink, issocket, ischardev or isblockdev, or equivalently replace -D by one of -P, -L, -S, -C or -B.
To follow symlinks to directories, change dir_tree to link_tree in the above examples. (To avoid symlink loops, link_tree remembers which directories it has already visited, by dev-inode number, and visits each one at most once.)


