Преобразование дней в дату

Поскольку вы хотите найти каталоги, а затем перечислить их содержимое, почему бы не использовать для этого 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
0
07.04.2020, 23:10
2 ответа

Во многих системах лучше всего работать с днями, начиная с эпохи (1970 -01 -01 ).

Таким образом, вы можете сохранить постоянное количество дней между 0000 -00 -00 и 1970 -01 -01, что равно 719528. Затем просуммируйте количество дней с начала эпохи:

echo $(( 719528 + $(date --utc --date "$1" +%s)/86400 ))
1
28.04.2021, 23:18

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
0
28.04.2021, 23:18

Теги

Похожие вопросы