Поскольку вы хотите найти каталоги, а затем перечислить их содержимое, почему бы не использовать для этого find
:
find /path/to/dir -type d -exec bash -O dotglob -O nullglob -c '
for pathname do
header=0
for filename in "$pathname"/*; do
if [ ! -d "$filename" ]; then
if [ "$header" -eq 0 ]; then
printf "%s/\n" "${pathname%/}"
header=1
fi
printf "%s\n" "${filename##*/}"
fi
done
[ "$header" -eq 1 ] && printf "\n"
done' bash {} +
Это находит все каталоги в заданном пути к каталогу или под ним. Он передает пути ко всем этим каталогам сценарию bash
.
Сценарий bash
будет перебирать каждый каталог, печатая путь к каталогу в качестве заголовка и перечисляя не -элементы каталога, присутствующие в этом каталоге. В конце, если в каталоге был найден хотя бы один файл из каталога, отличного от -, выводится дополнительная новая строка.
Каталоги, которые пусты или содержат только каталоги, не перечислены.
Для такой структуры каталогов, как
/dir
`-- a
|-- b
| `-- c
| |--.hidden_file
| `-- file
`-- file
Это приведет к следующему результату:
/dir/a/
file
/dir/a/b/c/
.hidden_file
file
Во многих системах лучше всего работать с днями, начиная с эпохи (1970 -01 -01 ).
Таким образом, вы можете сохранить постоянное количество дней между 0000 -00 -00 и 1970 -01 -01, что равно 719528. Затем просуммируйте количество дней с начала эпохи:
echo $(( 719528 + $(date --utc --date "$1" +%s)/86400 ))
Perl-модуль DateTime хорош для этих целей:
$ perl -MDateTime -E '
$base = DateTime->new(year=>0, month=>1, day=>1);
$now = DateTime->now;
say $now->delta_days($base)->in_units("days");
'
737887