Основываясь на моем комментарии, вариант может сделать то, что вы хотите:
find . -depth -type d -exec /bin/sh -c 'printf "%5d %s\n" "$(find {} -type f -printf . | wc -c)" "{}"' \;
(которая правильно скомпонована, безусловно, и по праву, выстрелит в меня за то, что я рассчитал результат для более глубоких подкаталогов несколько раз и надеялся, что кэш файловой системы в какой-то момент будет иметь все метаданные дерева, а также каждый раз порождать новую оболочку, но это начало.)
На вашем примере структуры я получаю:
4 ./dir1/subdir1
1 ./dir1/subdir2/subdir3
4 ./dir1/subdir2
9 ./dir1
2 ./dir2
11 .
(чтобы исключить текущий рабочий каталог, либо измените внешний поиск .
- найти *
или использовать найти. -mindepth 1
-121--160978-
Попробуйте сделать следующее:
find . -type f | perl -aF/ -lne 'for (my $i=0; $i < @F-1; ++$i) { print join("/",@F[0...$i]); }' | sort | uniq -c
найдите. -type f
печатает файлы:
./dir1/subdir2/file8
./dir1/subdir2/file7
./dir1/subdir2/subdir3/file9
./dir1/subdir2/file6
./dir1/file1
...
perl -aF/-lne 'для (my $ i = 0; $ i преобразует каждое имя файла
./a/b/c
в набор каталогов .
, ./a
, ./a/b
Примечание:
не работает с новыми строками в именах файлов. Можно использовать -print0
в найти
, -0
в perl
и поместить счетчики для каждого каталога в хэш.
Изменить:
find . -depth -print0 |
perl -0 -ne '
my $depth = tr!/!/!;
for (my $i = $prev_depth; $i <= $depth; ++$i) { $totals[$i] = 0; }
if ( -f $_ ) {
for (my $i = 0; $i <= $depth; ++$i) { ++$totals[$i]; }
} else {
print "$totals[$depth]\t$_\n";
}
$prev_depth = $depth;
'
Отлично работает с новыми строками в именах файлов. Работает нормально с пустыми каталогами. Не требует дополнительной сортировки | uniq -c
.
-121--160976-
Если предполагается, что имя службы является дозвуковым
, то при запуске systemctl status subsonic.service
и отсутствии ошибок служба дозвукового
запускается как системная служба, и в этом случае этот ответ не очень поможет.
Однако если вы получили там ошибку, но вместо этого запустите systemctl --user status subsonic.service
и не имеете ошибок, то это означает, что служба запускается под экземпляром пользователя systemd
, и первая строка выходных данных указывает, где хранится файл службы. Это означает, что для запуска службы пользователю необходимо сначала войти в систему.
Если требуется запустить службу для всех пользователей, независимо от того, зарегистрирован ли фактический пользователь или нет, переместите файл службы в /etc/systemd/system
(список системных путей см. в man systemd.unit
). Кроме того, при необходимости запуска службы от имени определенного пользователя (а не от имени root
) необходимо добавить User = subsonic
в раздел [Service]
файла (см. man systemd.service
).
После перемещения этого файла выполнение systemctl status subsonic.service
должно привести к некоторым выводам (вероятно, служба неактивна, но загружена), а выполнение systemctl --user status subsonic.service
должно привести к ошибке.