Вместо того, чтобы просматривать все и проверять, является ли каждый файл или непустой каталог, почему бы просто не искать файлы и непустые каталоги в первую очередь?
На основании вашего заявления, что I want to print out all sub-directory names with their content file names below the directory name.
это будет просто:
find . -mindepth 2 -maxdepth 2 ! -path . -type f -print0 |
awk -v RS='\0' -F'/' '!seen[$(NF-1)]++{print "dir", $(NF-1)} {print "file", $NF}'
Например:
$ find . -printf '%y %p\n'
d .
f ./file
d ./tmp1
d ./tmp2
f ./tmp2/bar
f ./tmp2/foo
$ find . -mindepth 2 -maxdepth 2 ! -path . -type f -print0 |
awk -v RS='\0' -F'/' '!seen[$(NF-1)]++{print "Processing directory", $(NF-1)} {print "Encoding", $NF}'
Processing directory tmp2
Encoding bar
Encoding foo
Массаж для костюма. Если вам НЕОБХОДИМО выполнить команду оболочки для каждого файла, тогда нет необходимости задействовать awk, и вы можете просто изменить вышеупомянутое значение на:
$ cat ../tst.sh
#!/bin/env bash
declare -A seen
while read -r -d '' line; do
path="${line%/*}"
dir="${path#*/}"
file="${line##*/}"
(( ! $(( seen[dir]++ )) )) && printf 'Processing directory %s\n' "$dir"
printf 'Encoding %s\n' "$file"
done < <(find . -mindepth 2 -maxdepth 2 ! -path . -type f -print0)
$ ../tst.sh
Processing directory tmp2
Encoding bar
Encoding foo