Я хочу знать, сколько обычных файлов имеют расширение .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
во время выполнения команд отключено) (если я пропустил, пожалуйста, дайте мне знать). Это цифры, которые я хочу.
Пожалуйста, не стесняйтесь не использовать этот конкретный тест.
Примечание: ответы в любой оболочке или на другом языке будут проверены и оценены мной. Если мне нужно установить новые пакеты, нет проблем. Если вы знаете решение с графическим интерфейсом, я призываю вас поделиться им (но я не могу пойти так далеко, чтобы установить целый DE для его тестирования) :) Я использую Ubuntu MATE 17.10.