Как перечислить все файлы в папке и подпапках на листе?
Каталог (файловая система)
Катало́г — каталог, директория, справочник, папка — объект в файловой системе, упрощающий организацию файлов. Ранее часто использовалось слово директо́рия [1] , которое представляет собой транслитерацию с английского (англ. directory ). Типичная файловая система содержит большое количество файлов, и каталоги помогают упорядочить её путём их группировки. Каталог может быть реализован как специальный файл, где регистрируется информация о других файлах и каталогах на носителе информации [1] .
Содержание
Корневой каталог [ править | править код ]
Папка, которая прямо или косвенно содержит все остальные папки и файлы в файловой системе, называется корневой папкой. В Unix-подобных операционных системах он обозначается символом / (косая черта, обратная косая черта, заглавная булавка), в DOS и Windows исторически использовался символ (обратная косая черта, обратная косая черта, коммунистическая булавка), но / также поддерживался некоторое время.
Текущий каталог [ править | править код ]
Текущий каталог — это каталог, с которым работает операционная система, если вы не указали другой каталог. Он обозначается точкой (. ).
Команда CD используется для изменения текущего каталога на другой; без указания целевого каталога она изменяет каталог на домашний (в системах Unix) или возвращает текущий каталог (в Windows).
Родительский каталог [ править | править код ]
Родительский каталог — это каталог, в котором находится текущий каталог. Он обозначается двумя точками (. ).
Пример (переключение на родительский каталог):
Каталоги в UNIX [ править | править код ]
Каталог в UNIX — это файл, содержащий несколько inode и привязанные к ним имена. [2] В современных UNIX-подобных ОС вводится структура каталогов, соответствующая стандарту FHS.
Иерархия каталогов в Windows [ править | править код ]
Каталог, который не является подкаталогом другого каталога, называется корневым. Этот каталог находится на вершине иерархии всех остальных каталогов. Корневой каталог каждого логического диска в Windows — это папка с именами C:, D: и т. д. ).
Каталоги в Windows бывают системные (служебные, созданные ОС) и пользовательские (созданные пользователем). Пример системных каталогов: «Рабочий стол», «Корзина», «Сетевое окружение», «Панель управления», каталоги логических дисков и т. п.
Термин «Папка» [ править | править код ]
Термин папка (англ. folder ) был введён для представления объектов файловой системы в графическом пользовательском интерфейсе путём аналогии с офисными папками. Он был впервые использован в Mac System Software, предшественнице Mac OS, а в системах семейства Windows — с выходом Windows 95. [3] Эта метафора стала использоваться в большом числе операционных систем: Windows NT, Mac OS, Mac OS X, а также в средах рабочего стола для систем семейства UNIX (например, KDE и GNOME).
До Windows 95 это были папки или файлы.
В этой терминологии папка, расположенная в другой папке, называется вложенной папкой, подпапкой или дочерней папкой. Папки компьютера образуют иерархическую структуру (дерево каталогов). В операционных системах, не допускающих «физических ссылок» (например, Windows 3.x и 9x, которые допускали только ярлыки), возможна древовидная структура. Можно сказать, что файловая система — это граф.
Получение списка файлов в директории на Python
Все чаще современные программисты предпочитают работать с языком программирования Python, поскольку он очень гибкий и позволяет легко взаимодействовать с операционной системой. Он также включает функции для работы с файловой системой. Проблема печати списка файлов в каталоге может быть решена с помощью различных модулей: os, subprocess, fnmatch и pathlib. Следующие решения показывают, как успешно использовать эти модули.
Применение os.walk()
Модуль os содержит длинный список методов, которые работают с файловой системой и операционной системой. Один из них — walk(), который возвращает имена файлов в дереве каталогов, двигаясь вверх или вниз по дереву (по умолчанию сверху вниз).
Os.walk() возвращает список, состоящий из трех элементов: имя корневого каталога, список имен подкаталогов и список файлов в текущем каталоге. Он одинаково хорошо работает с интерпретаторами Python 2 и 3.
Использование командной строки, через subprocess
Модуль подпроцесса позволяет выполнить системную команду и собрать ее результат. Наша системная команда выглядит следующим образом:
Команда ls -p . выводит список файлов в текущем каталоге, добавляя разделитель / в конце имени каждого подкаталога, который понадобится нам в следующем шаге. Вывод этого вызова передается команде grep, которая фильтрует данные по мере их поступления. -v / $ исключает все имена записей, содержащие разделитель /. / $ сопоставляет все строки, содержащие символ /, с самым последним символом в строке, определяемым символом $.
Используя модуль subprocess, вы можете строить настоящие конвейеры и соединять потоки ввода и вывода, как при обработке в командной строке. Вызов метода subprocess. Popen() открывает соответствующий процесс и определяет два параметра stdin и stdout.
Во-первых, ls определяет конвейер для выполнения ls -p для захвата stdout. Подпроцессы определяются как потоки типа stdout. PIPE. Другая переменная grep выполняет инструкцию grep -v /$ вместо того, чтобы быть определенной как процесс.
Этот поток назначается ls.stdout для получения вывода grep stdin от конвейеров, выполняющих ls.stdin. В заключение, grep.stdout считывается endOfPipe, а затем выводится на stdout с помощью цикла for.
Однако это решение не так хорошо, как Python 2, но его можно сделать лучше. Рассмотрите другие варианты.
Комбинация os и fnmatch
Подпроцессы предлагают элегантное решение, но требуют много кода. Вместо этого воспользуемся методами из os и fnmatch. Этот вариант также совместим с Python 2 и 3.
Сначала мы импортируем модули os и fnmatch. Для перечисления файлов мы будем использовать os.listdir(), а также шаблон для фильтрации файлов. В цикле for переменная listOfFiles используется для итерации по списку записей.
Последний шаг — это использование fnmatch для фильтрации всех интересующих вас записей и вывод соответствующих записей в stdout.
Использование os.listdir() и генераторов
В следующем варианте метод os.listdir() и функция генератора объединены. Код поддерживает Python версий 2 и 3.
Как упоминалось ранее, listdir() возвращает список записей для данного каталога. Метод os.path.isfile() возвращает True, если указанная запись является файлом. Оператор yield завершает функцию, но сохраняет текущее состояние и возвращает только имя записи файла.
Использование pathlib
Модуль pathlib предназначен для разбора, сборки, тестирования и других манипуляций с именами файлов и путями, используя объектно-ориентированный API вместо низкоуровневых строковых операций. Начиная с Python 3, этот модуль включен в стандартную библиотеку.
В следующем списке текущая папка определяется с полной остановкой («.»). Метод iterdir() затем возвращает итератор, который возвращает все имена файлов. Затем цикл for выводит имена файлов по одному.
В качестве альтернативы можно отфильтровать файлы по имени, используя метод glob. Следовательно, мы можем получить нужные файлы. Например, приведенный ниже код перечисляет файлы Python в выбранном каталоге, указав в glob шаблон «*.py».
Использование os.scandir()
В Python 3.6 добавлен новый метод, scandir(), который доступен из модуля os. Как следует из названия, с его помощью гораздо проще получить список файлов в каталоге.
Чтобы определить текущий рабочий каталог и сохранить его, мы инициализируем значение переменной path, импортировав модуль os и вызвав getcwd(). Затем scandir() возвращает список записей для выбранного пути, который проверяется на принадлежность к файлу с помощью метода is_file().
Вывод
Некоторые люди спорят о том, что лучше, что элегантнее и что более «питонично». Помимо метода os.walk(), мне нравятся модули fnmatch и pathlib.
Обе версии с процессом/транспортером и итератором требуют более глубокого понимания процессов UNIX и знания Python, поэтому их могут предпочесть не все программисты из-за дополнительной (и избыточной) сложности.
Вот что мы можем сделать: использовать удобный модуль timeit для поиска самого быстрого ответа. С помощью этого модуля можно измерить время, прошедшее между двумя событиями.
Чтобы сравнить все решения без их изменения, используем функциональность Python: вызовем интерпретатор с модулем timeit и соответствующий Python-скрипт. Для автоматизации процесса напишем shell-скрипт
Как перечислить все файлы в папке и подпапках на листе?
Используйте утилиту find для поиска файлов в дереве каталогов по имени файла. Укажите имя дерева каталогов, в котором вы хотите выполнить поиск, а затем, используя опцию «имя», имя нужного вам файла.
Чтобы посмотреть список всех файлов системы с именем `top’, введите
$ найти / -имя top [Enter]
Эта команда выполнит поиск во всех каталогах, к которым вам разрешен доступ; если вам не разрешено читать содержимое каталога, find сообщит вам, что вам запрещен поиск в этом каталоге.
Опция `-name’ различает заглавные и строчные буквы; чтобы использовать поиск без этих различий, воспользуйтесь опцией `-iname’.
Чтобы перечислить все файлы в системе с именем `top’, с учетом регистра, введите:
$ find / -iname top [Enter]
С помощью этой команды можно просмотреть все файлы, в имени которых содержатся буквы *top*, включая `Top’, `top’ и `TOP’.
Удобно использовать метасимволы для поиска файлов, имена которых соответствуют определенному шаблону. Шаблоны имен должны быть указаны через запятую.
Список системных файлов, имена которых начинаются с букв `top’, можно получить, набрав:
$ find / -name ‘top*’ [Enter]
Список системных файлов, имена которых начинаются с букв *top’, за которыми следуют еще три символа, можно получить, напечатав:
$ find / -name ‘top. ‘ [Enter]
Чтобы получить список файлов в системе, имена которых начинаются с букв «top», за которыми следуют пять или более символов, введите
$ find / -name ‘top. *’ [Enter]
Чтобы просмотреть все файлы с расширением `.tex’ в вашем рабочем каталоге, независимо от их написания, введите:
-имя «*.tex» [Enter]
Чтобы просмотреть все файлы в каталоге */usr/share’, содержащие в своем имени слово *farm’, введите:
$ find /usr/share -name ‘*farm*’ [Enter]
Вместо параметра *-name’ укажите *-regex’, если вы хотите найти файлы, имена которых соответствуют регулярному выражению.
Введите эти команды, чтобы просмотреть все файлы в текущем каталоге, имена которых содержат строку *net’ или *comm’:
Обратите внимание, что опция *regex’ соответствует полному имени файла относительно указанного каталога, а не отдельным именам файлов в каждой строке.
Для поиска файлов определенного размера используйте `size’, за которым следует нужный размер файла. Размер файла может быть указан тремя различными способами: если указан знак плюс (`+’), то ищутся все файлы больше указанного размера; если указан знак минус (`-‘), то ищутся все файлы меньше указанного размера; если префикс не указан, то ищутся файлы точно указанного размера. (Единицей измерения является блок из 512 байт; «k» после размера означает килобайты, «b» — байты).
Чтобы вывести список файлов в каталоге `/usr/local’ размером более 10000 килобайт, введите:
$ find /usr/local -size +10000k [Enter]
Чтобы вывести список файлов в домашнем каталоге, размер которых меньше 300 байт, наберите
-размер -300b [Вступление].
Для просмотра списка системных файлов, состоящих из 42 блоков по 512 байт, введите:
$ найти / -размер 42 [Enter]
Если вы ищете пустые файлы, используйте опцию *-empty’. файлы размером 0 байт. Вы можете использовать этот параметр для поиска и удаления ненужных файлов.
Чтобы найти все пустые файлы в своей домашней папке, введите
Чтобы найти файлы, измененные в определенное время, используйте команду find с параметрами «mtime» или «mmin»; аргумент «mtime» указывает на количество прошедших дней (24 часа), а аргумент «mmin» — количество прошедших минут.
Чтобы показать все файлы в каталоге `/usr/local’, измененные ровно 24 часа назад, введите
$ find /usr/local -mtime 1 [Enter]
Чтобы просмотреть все файлы в папке `/usr’, которые были изменены 5 минут назад, введите:
$ find /usr -mmin 5 [Enter]
Если вы хотите получить оглавление папки, начиная с самых маленьких файлов, используйте ls с ключами `-S’ и `-r’, которые сортируют вывод в обратном порядке:
Если вы хотите посмотреть все файлы, которые были изменены в каталоге */usr/local’ в течение последних 24 часов, введите:
$ find /usr/local -mtime -1 [Enter]
Опция `daystart’ задает отсчет времени от начала текущего дня.
Чтобы просмотреть все файлы в вашем домашнем каталоге, которые были изменены вчера, введите
-mtime 1 -daystart [Enter]
Чтобы отобразить все файлы в каталоге `/usr’, которые были изменены в течение года, введите
$ find /usr -mtime +356 -daystart [Enter]
Вы можете увидеть все файлы в вашей домашней папке, которые были изменены в период от 2 до 4 дней назад, набрав :
-mtime 2 -mtime -4 -daystart [Enter]
Чтобы найти файлы, более новые, чем определенный файл, введите его имя в качестве аргумента опции `-newer’.
Чтобы просмотреть все файлы в каталоге `/etc’, более новые, чем файл `/etc/motd’, введите
$ find /etc -newer /etc/motd [Enter]
Если вы хотите найти все файлы, более новые, чем определенная дата, вы можете использовать следующий трюк: создайте временный файл в папке `/tmp’ и установите его дату модификации на желаемую дату с помощью touch, затем определите его как аргумент для `-newer’.
Чтобы просмотреть все файлы в домашней папке, измененные с 4 мая этого года, введите
Для поиска файлов, принадлежащих определенному пользователю, укажите имя пользователя в качестве опции `-user’. Например, для поиска всех файлов в каталоге `/usr/local/fonts’, принадлежащих пользователю warwick, введите:
$ find /usr/local/fonts -user warwick [Enter]
Опция `-group’ аналогичным образом определяет файлы, принадлежащие некоторой группе пользователей.
Если вы хотите посмотреть, какие файлы находятся в каталоге группы аудио, введите следующее:
$ find /dev -group audio [Enter]
Вы можете использовать команду find для выполнения других команд над найденными файлами, указав необходимые команды в качестве аргументов опции `-exec’. Если вы используете строку `»’, эта строка заменяется именем файла, найденного в команде. Конец команды указывается с помощью строки `’;».
Вы можете распечатать строки из всех файлов в каталоге */html/’, содержащих слово *organic’, набрав :
/html/ -name ‘*.html’ -exec grep organic ‘<>‘ ‘;’ [Enter]
Чтобы подтвердить команду для файла, найденного find, используйте клавишу `-ok’, а не `-exec’.
Чтобы удалить из домашнего каталога файлы, к которым обращались более одного года назад, с подтверждением для каждого файла, введите
-used +365 -ok rm ‘<>‘ ‘;’ [Enter]
Вы можете задать сразу несколько параметров поиска, чтобы найти файлы, отвечающие нескольким критериям одновременно.
Чтобы получить список файлов в домашнем каталоге, имена которых начинаются со строки `top’ и которые новее файла `/etc/motd’, введите
-name ‘top*’ -newer /etc/motd [Enter]
Чтобы сжать все файлы в домашней папке размером более 2 Мб, которые еще не сжаты gzip (не имеют расширения `.gz’), введите
-size +2000000c -regex ‘.*[^gz]’ -exec gzip ‘<>‘ ‘;’ [Enter]
Чтобы найти самый большой файл в каталоге, используйте команду ls с опцией `-S’, которая сортирует файлы в порядке убывания по размеру (обычно ls перечисляет файлы в алфавитном порядке). Используйте опцию *-l’ для вывода размера файла и других атрибутов. Пример:
Оглавление каталога начинается с самого маленького файла при использовании ls с ключами *-S’ и *-r’, которые сортируют вывод в обратном порядке. Пример:
Вы можете использовать du и sort для вывода списка каталогов, отсортированных по размеру — то есть по размеру файлов, которые они содержат. du выводит каталоги в порядке возрастания, начиная с самого маленького; опция *-S’ помещает размер каталога в килобитах в первый столбец. Направьте вывод в команду sort с ключом *-n’, чтобы отсортировать список численно, и укажите дерево каталогов в качестве аргумента.
Если вам нужно отобразить список подкаталогов в дереве текущего каталога, упорядоченных по размеру, введите:
$ вы -S . сортировать -n [Enter]|.
Вы можете использовать клавишу *-r, чтобы показать сначала самые большие каталоги:
$ от -S . сортировать -nr [Enter]|.
Чтобы быстро определить количество файлов в каталоге, используйте ls и перенаправьте вывод команде `wc -l’, которая выведет количество строк, поступающих на ее вход.
Чтобы отобразить общее число файлов в текущем каталоге, введите
Общее количество файлов составляет 19.
Поскольку по умолчанию ls не показывает скрытые файлы, приведенная выше команда их не считает. Опция `-A’ в ls будет подсчитывать как обычные, так и скрытые файлы:
Чтобы посчитать количество файлов во всем дереве каталогов, а не только в отдельном каталоге, используйте find вместо ls, и укажите специальный ключ для find — строку `
! -type d’, чтобы исключить вывод и подсчет каталогов.
Введите следующие команды для отображения количества файлов в /usr/share’:
$ find /usr/share ! -type d wc -l [Enter]|
Чтобы получить количество файлов и каталогов в дереве `/usr/share’, наберите :
$ find /usr/share wc -l [Enter]|
Если вы хотите посмотреть количество каталогов в дереве `/usr/share’, введите:
$ find /usr/share ! -type f wc -l [Enter]|
С помощью команды where можно легко найти полный путь к приложению или команде, указав имя ее базового файла. Для этого убедитесь, что приложение или команда присутствует в системе.
Чтобы узнать, установлен ли perl в вашей системе и где он находится, наберите
Следующее: Инструменты управления файлами Вверх: Инструменты поиска файлов Предыдущий: Поиск файлов с помощью указателя содержания Алекс Отвагин 2002-12-16