Хочу знати, скільки регулярних файлів мають розширення .c
у великій складній структурі каталогів, а також скільки каталогів ці файли поширюються по всій. Я хочу отримати лише два числа.
Я бачив це питання про те, як отримати кількість файлів, але мені потрібно знати кількість каталогів, в яких також є файли.
- Мої імена файлів (включаючи каталоги) можуть мати будь-які символи; вони можуть починатися з
.
або-
мати пробіли або нові рядки. - У мене можуть бути кілька посилань, назви яких закінчуються
.c
, і посилання на каталоги. Я не хочу, щоб символічні посилання переглядалися чи рахувалися, або я, принаймні, хочу знати, чи і коли вони рахуються. - Структура каталогів має багато рівнів, а каталог верхнього рівня (робочий каталог) містить принаймні один
.c
файл.
Я поспішно написав кілька команд в оболонці (Bash), щоб їх сам порахувати, але не думаю, що результат є точним ...
shopt -s dotglob
shopt -s globstar
mkdir out
for d in **/; do
find "$d" -maxdepth 1 -type f -name "*.c" >> out/$(basename "$d")
done
ls -1Aq out | wc -l
cat out/* | wc -l
Це виводить скарги на неоднозначні переадресації, пропускає файли у поточному каталозі та видаляє спеціальні символи (наприклад, перенаправлений find
вихід друкує нові рядки у назви файлів ) та записує цілу купу порожніх файлів (ой).
Як я можу надійно перерахувати свої .c
файли та файли, що містять їх?
Якщо це допомагає, ось кілька команд для створення тестової структури з неправильними іменами та посиланнями:
mkdir -p cfiles/{1..3}/{a..b} && cd cfiles
mkdir space\ d
touch -- i.c -.c bad\ .c 'terrible
.c' not-c .hidden.c
for d in space\ d 1 2 2/{a..b} 3/b; do cp -t "$d" -- *.c; done
ln -s 2 dirlink
ln -s 3/b/i.c filelink.c
У отриманій структурі 7 каталогів містять .c
файли, а 29 звичайних файлів закінчуються .c
(якщо dotglob
вимкнено, коли команди виконуються) (якщо я зробив неправильний рахунок, будь ласка, повідомте мене про це). Це числа, які я хочу.
Будь ласка, не користуйтеся цим тестом.
Примітка: Відповіді будь-якою оболонкою чи іншою мовою будуть перевірені та оцінені мною. Якщо мені доведеться встановити нові пакети, немає проблем. Якщо ви знаєте рішення GUI, я рекомендую вам поділитися (але я не можу піти так далеко, щоб встановити цілий DE для його тестування) :) Я використовую Ubuntu MATE 17.10.