This script defines a function walk()
and then runs walk
on the first argument passed to the script.
The function first defines a local variable (one known only to the function and its children) indent
indent
is locally defined as "${2:-0}"
. This means that if $2
(the second argument received by the walk
command) is unset, then make it 0
. This variable is local
so that you cannot pass a second argument to the script yourself.
The function then prints the contents of the directory specified on the command line ($1
) in this format
printf "%*s%s\n" $indent '' "$1"
This means, print $indent
number of spaces, then print the name of the directory as a string (so a number is not expected), then print a newline.
Then the function runs a loop
for entry in $1/*; do
This assigns every non-hidden file or sub-directory in $1
(the directory specified as the first argument to walk
) to the variable entry
and loops over them, running this command on them:
[[ -d "$entry" ]] && walk "$entry" $((indent+4))
This means, if entry
is a directory, then run walk
on entry
. Now walk
has a second argument $((indent+4))
, which will be used instead of 0
as the new value of indent
. The effect of this is that the first level directory is not indented at all, but the second level directories are indented 4 spaces, the third level 8 spaces, etc. Since entry
is now the first argument, $1
of the walk
function, it will recurse throughout the structure.
The script ends by running the walk
function on the positional parameter $1
, the first argument passed to the script. Usage could be
./script directory
This means directory
is $1
and walk
will be run on directory
.
It would be nice if the script printed regular files I think, but they would look confusing without some elaborate formatting. I recommend using tree
for this purpose instead of the script!
tree -d /path/to/dir
does something very similar btw. – dessert Oct 05 '17 at 10:02printf "%*s%s\n"
should better be eitherprintf '%*s%s\n'
orprintf "%*s%s\\n"
, see the very helpfulshellcheck
online and for the terminal. – dessert Oct 05 '17 at 10:08