I have code, which output files and directories from directory and subdirectories. But I should to output only files with nest level. Also I can't use find and ls. Only recursion with for loop. How to do it?
#!/bin/bash
recurse() {
for i in "$1"/*;do
if [ -d "$i" ];then
recurse "$i"
elif [ -f "$i" ]; then
echo "level) $i"
fi
done
}
recurse "$1"
Call ./script.sh /home
CodePudding user response:
Welcome to Stackoverflow. You're almost there! Assuming you meant a zero-based nest level, try this:
#!/usr/bin/env bash
set -e -u
recurse() {
local level="${2:-0}"
for i in "$1"/*; do
if [ -d "$i" ]; then
recurse "$i" "$(( level 1 ))"
elif [ -f "$i" ]; then
echo "level $level) $i"
fi
done
}
recurse "$1"
Note this is passing through a state variable (depth here), which is common in recursive programming. The default is set to zero.
To test for a tree like this:
$ tree
.
├── bar
├── foo
│ ├── bar
│ │ ├── hello
│ │ └── hi
│ └── me
└── script.sh
It runs like this:
$ ./script.sh .
level 2) ./foo/bar/yo
level 1) ./foo/me
level 0) ./script.sh