Python имеет os.walk, что делает такие задачи такими же легкими, интуитивно понятными и автоматически надежными даже перед лицом странных имен файлов, таких как те, которые содержат символы новой строки. Этот сценарий Python 3, который я изначально разместил в чате, предназначен для запуска в текущем каталоге (но он не должен находиться в текущем каталоге, и вы можете изменить его путь к os.walk), :
#!/usr/bin/env python3
import os
dc = fc = 0
for _, _, fs in os.walk('.'):
c = sum(f.endswith('.c') for f in fs)
if c:
dc += 1
fc += c
print(dc, fc)
Это печатает количество каталогов, в которых содержится хотя бы один файл, имя которого заканчивается на .c, за которым следует пробел, за которым следует количество файлов, имена которых заканчиваются на .c , «Скрытые» файлы, то есть файлы, имена которых начинаются с ., включены, а скрытые каталоги аналогичным образом пересекаются.
os.walk Он перечисляет все каталоги, которые рекурсивно доступны из исходной точки, которую вы им даете, приводя информацию о каждом из них как кортеж из трех значений root, dirs, files. Для каждого каталога он переходит к (включая первый, имя которого вы даете ему):
root содержит путь к этому каталогу. Обратите внимание, что это абсолютно не связано с «корневым каталогом» системы / (а также не связано с /root), хотя оно будет идти к тем, если вы начнете там. В этом случае root начинается с пути . - i.e., Текущего каталога - и проходит повсюду под ним. dirs содержит список путей всех подкаталогов каталога, имя которого в настоящее время хранится в root. files содержит список путей всех файлов, которые находятся в каталоге, имя которого в настоящее время хранится в root, но которые не являются самими каталогами. Обратите внимание, что это включает в себя другие типы файлов, чем обычные файлы, включая символические ссылки, но похоже, что вы не ожидаете окончания таких записей в .c и заинтересованы в том, чтобы видеть что-либо подобное.В этом случае мне нужно только изучить третий элемент кортежа, files (который я называю fs в скрипте). Как и команда find, Python os.walk перемещается в подкаталоги для меня; единственное, что я должен проверить сам, это имена файлов, в которые каждый из них содержится. В отличие от команды find, os.walk автоматически предоставляет мне список этих имен файлов.
Этот скрипт не соответствует символическим ссылкам. Вы, вероятно, , что хотите, чтобы для такой операции были использованы символические ссылки, потому что они могли образовывать циклы, и поскольку даже если нет циклов, одни и те же файлы и каталоги могут проходить и подсчитываться несколько раз, если они доступны через различные символические ссылки.
Если вы когда-либо хотели os.walk следовать символическим ссылкам, что вы обычно не хотели, то вы можете передать followlinks=true на него. То есть вместо записи os.walk('.') вы можете написать os.walk('.', followlinks=true). Я повторяю, что вы редко этого хотели, особенно для такой задачи, в которой вы рекурсивно перечисляете всю структуру каталогов, независимо от того, насколько она велика, и подсчитывая все файлы в ней, которые удовлетворяют некоторым требованиям.
У меня была такая же ошибка с установщиком, пытающимся удалить раздел LVM.
После сбоя установки выберите команду перейти в командную строку. Оттуда:
$ sudo fdisk -l (to see the drive name and see the partitions)
$ sudo parted
p
select /dev/sda (or whatever your drive is named)
p (too show the partitions and their numbers)
rm 1
rm 2
(etc until they are all gone)
q
$ sudo fdisk -l (verify the partitions are gone)
Перезагрузитесь и установите снова.
У меня была такая же ошибка с установщиком, пытающимся удалить раздел LVM.
После сбоя установки выберите команду перейти в командную строку. Оттуда:
$ sudo fdisk -l (to see the drive name and see the partitions)
$ sudo parted
p
select /dev/sda (or whatever your drive is named)
p (too show the partitions and their numbers)
rm 1
rm 2
(etc until they are all gone)
q
$ sudo fdisk -l (verify the partitions are gone)
Перезагрузитесь и установите снова.
У меня была такая же ошибка с установщиком, пытающимся удалить раздел LVM.
После сбоя установки выберите команду перейти в командную строку. Оттуда:
$ sudo fdisk -l (to see the drive name and see the partitions)
$ sudo parted
p
select /dev/sda (or whatever your drive is named)
p (too show the partitions and their numbers)
rm 1
rm 2
(etc until they are all gone)
q
$ sudo fdisk -l (verify the partitions are gone)
Перезагрузитесь и установите снова.
У меня была такая же ошибка с установщиком, пытающимся удалить раздел LVM.
После сбоя установки выберите команду перейти в командную строку. Оттуда:
$ sudo fdisk -l (to see the drive name and see the partitions)
$ sudo parted
p
select /dev/sda (or whatever your drive is named)
p (too show the partitions and their numbers)
rm 1
rm 2
(etc until they are all gone)
q
$ sudo fdisk -l (verify the partitions are gone)
Перезагрузитесь и установите снова.