Вопрос или проблема
Я не человек, работающий с Unix / Linux, поэтому испытываю трудности с командой / скриптом, который мог бы дать мне количество файлов в каталоге и во множестве подкаталогов.
Я хочу сгенерировать вывод в формате, аналогичном ниже
Год Каталог Подкаталог (если есть) Количество (не включайте количество дочерних каталогов)
Например:
Год Каталог Подкаталог (если есть) Количество
2021 root - 1000
2021 root root/child1 100
2021 root root/child1/subchild1 10
2021 root root/child1/subchild1/{и так далее}
2022 root - 50
2022 root root/child1 10
2022 root root/child1/subchild1 1
2022 root root/child1/subchild1/{и так далее}
и так далее...
Любая помощь будет очень полезной.
Редактировать:
- Не будет более 2-3 подкаталогов, но можно ограничиться максимум 3.
- Год будет годом создания файла.
- Количество необходимо только для файлов внутри каталога.
- Исключить ссылки или скрытые файлы.
Это коробка с Linux, работающая на Red Hat v7.9, если это поможет
Вы можете сделать это так, используя функцию globstar
в bash
для рекурсии с помощью **
:
#!/bin/bash
shopt -s globstar
{
printf '%s\n' 'Год Каталог Подкаталог Количество'
{
for dir in **/*/; do
(
cd "$dir"
echo "$(
stat -c '%y' "$PWD" |
cut -d'-' -f1) ${PWD}: количество: $(
find -maxdepth 1 -type f ! -name '.*' |
wc -l
)"
)
done
} | perl -lane '
@{ $main::v->{$F[0]} } = @F[1..$#F];
END{print map { "$_ @{ $main::v->{$_} }\n" } sort keys %$main::v}'
} | column -t
Ответ или решение
Чтобы получить количество файлов в директории и её подкаталогах, сгруппировав результаты по годам создания файлов, можно использовать Bash-скрипт на Linux. В данном ответе я представлю пошаговый процесс, который поможет вам добиться желаемого результата. Мы будем использовать команду find
для поиска файлов, а также stat
для получения даты создания файлов.
Шаг 1: Подготовка скрипта
Создайте новый текстовый файл и откройте его для редактирования. Мы начнем с написания основного скрипта.
#!/bin/bash
shopt -s globstar
printf '%s\n' 'Year Dir Sub-Dir Count'
# Цикл по всем директориям и поддиректориям
for dir in **/*/; do
# Переход в текущую директорию
(
cd "$dir" || continue
# Получаем год создания с помощью команды 'stat'
year=$(stat -c '%y' . | cut -d'-' -f1)
# Считаем количество файлов в текущей директории (не включая подкаталоги и скрытые файлы)
count=$(find . -maxdepth 1 -type f ! -name '.*' | wc -l)
# Получаем путь текущей директории
path=$(realpath --relative-to="$1" "$dir")
# Выводим результат
echo "$year ${1:-.} $path $count"
)
done | sort
Шаг 2: Объяснение кода
-
Настройка globstar: Мы включаем globstar с помощью
shopt -s globstar
, что позволяет использовать**
для рекурсивного поиска в подкаталогах. -
Цикл по директориям: Мы используем цикл
for
для итерации по всем директориям и поддиректориям. Результат будет включать как корневую директорию, так и её подкаталоги. -
Переход в директорию: Используем
cd "$dir"
для входа в текущую директорию. Если вход не удался, мы пропускаем итерацию с помощью|| continue
. -
Получение года создания файла: Команда
stat -c '%y' .
возвращает дату создания директории. Мы используемcut
для извлечения года. -
Подсчет файлов:
find . -maxdepth 1 -type f ! -name '.*'
ищет только файлы, исключая скрытые, и возвращает количество файлов в текущей директории, используяwc -l
. -
Вывод результата: Скрипт форматирует вывод в запрашиваемом формате.
Шаг 3: Запуск скрипта
После написания скрипта сохраните файл. Дайте ему разрешение на выполнение:
chmod +x ваш_скрипт.sh
Запустите его в директории, которую хотите обработать:
./ваш_скрипт.sh /путь/к/вашей/директории
Вывод
С помощью вышеописанного решения вы получите организованный список файлов, сгруппированных по годам, с указанием директорий и количества файлов. Такой результат будет полезен для анализа структуры файловой системы и для отчетности. Перед использованием скрипта рекомендую протестировать его на небольшой выборке данных, чтобы убедиться, что вывод соответствует вашим ожиданиям.