Как можно получить список папок в определенной директории?

Как можно получить папки из директории "/var/www/upload/files" по частям по 100 штук, чтобы избежать длительного ожидания или зависания скрипта из-за большого количества папок?
  • 5 февраля 2024 г. 19:39
Ответы на вопрос 2
Чтобы получить список папок в определенной директории, можно использовать различные подходы в зависимости от используемого языка программирования и командной оболочки. Ниже приведен пример того, как это можно сделать в командной строке Linux и в скрипте на Python.

### В командной оболочке Linux:

Вы можете использовать команду `ls` или `find` для получения списка папок в директории `/var/www/upload/files`. Вот пример использования `find`:

```shell
find /var/www/upload/files -maxdepth 1 -type d
```

Эта команда найдет все папки (`-type d`) на уровне вложенности не глубже одной папки относительно целевой директории (`-maxdepth 1`).

### В Python:

Для работы с файловой системой в Python можно использовать модуль `os`. Вот пример скрипта, который выводит список папок в `/var/www/upload/files`:

```python
import os

directory = '/var/www/upload/files'
folders = [os.path.join(directory, d) for d in os.listdir(directory) if os.path.isdir(os.path.join(directory, d))]
print(folders)
```

### Получение папок по частям:

Чтобы получить список папок по частям, вы можете использовать генераторы в Python, чтобы избежать загрузки всех папок в память сразу. Например, следующий код будет выдавать списки папок по 100 штук:

```python
import os

def chunked_folders_generator(directory, chunk_size=100):
    folders_list = []
    for entry in os.scandir(directory):
        if entry.is_dir():
            folders_list.append(entry.path)
            if len(folders_list) == chunk_size:
                yield folders_list
                folders_list = []
    if folders_list:  # yield remaining folders, if any
        yield folders_list

directory = '/var/www/upload/files'
for chunk in chunked_folders_generator(directory, chunk_size=100):
    print(chunk) # Здесь можно обрабатывать каждые 100 папок
```

Этот код определяет функцию `chunked_folders_generator`, которая является генератором и возвращает части списка папок по `chunk_size` штук. Вызывая эту функцию в цикле, можно обрабатывать папки небольшими порциями, что позволяет избежать замедления работы скрипта и чрезмерного потребления памяти при работе с большим количеством данных.
https://www.php.net/manual/en/class.directoryitera... 
https://www.php.net/manual/en/class.limititerator.php
Лимит итератор работает как лимит в mysql. Если понимаете как работает постраничная навигация, разберётесь
Похожие вопросы