Поиск файлов и перемещение - PullRequest
0 голосов
/ 05 ноября 2019

Я ищу все файлы, заканчивающиеся на .mkv. Все они находятся в отдельных каталогах.

Когда я нахожу файл, я хочу переместить родительский каталог в другую папку.

for video in Path('/home/public/video/finished/').rglob('*.mkv'):
    shutil.move(str(video.parent), '/home/public/video/delete/')

Это работает, но если требуется несколько каталоговдля перемещения, перемещается только один, и я получаю сообщение об ошибке:

  File "./py-test.py", line 13, in <module>
    for video in Path('/home/public/video/finished/').rglob('*.mkv'):
  File "/usr/lib/python3.6/pathlib.py", line 1112, in rglob
    for p in selector.select_from(self):
  File "/usr/lib/python3.6/pathlib.py", line 559, in _select_from
    for starting_point in self._iterate_directories(parent_path, is_dir, scandir):
  File "/usr/lib/python3.6/pathlib.py", line 549, in _iterate_directories
    for p in self._iterate_directories(path, is_dir, scandir):
  File "/usr/lib/python3.6/pathlib.py", line 545, in _iterate_directories
    entries = list(scandir(parent_path))
  File "/usr/lib/python3.6/pathlib.py", line 387, in wrapped
    return strfunc(str(pathobj), *args)

Я пытался os.rename(), но он жалуется на то, что каталог источника не пустой.

1 Ответ

1 голос
/ 05 ноября 2019

Вот возможное решение:

from pathlib import Path

source_dir = Path('/home/public/video/finished')
target_dir = Path('/home/public/video/delete')

dirs_to_move = []

for obj in source_dir.glob('*'):
    if obj.is_dir() and next(obj.rglob('*.mkv'), None):
        if obj not in dirs_to_move:
            dirs_to_move.append(obj)

if dirs_to_move:
    for dir in dirs_to_move:
        dir.rename(target_dir/dir.name)

Имейте в виду, что если у вас есть /home/public/video/finished/dir/subdir/file.mkv, приведенный выше код переместит /home/public/video/finished/dir в target_dir.

It не проверено , хотя. Обращаться осторожно! : -)

Вот небольшое доказательство концепции, но ничего не движется. Просто список каталогов, содержащих .jpg файлы:

Python 3.7.5 (default, Oct 17 2019, 12:16:48) 
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pathlib import Path
>>> home = Path('/home/accdias')
>>> for obj in home.glob('*'):
...     if obj.is_dir() and next(obj.rglob('*.jpg'), None):
...             print(obj)
... 
/home/accdias/Downloads
/home/accdias/Dropbox
/home/accdias/Pictures
/home/accdias/git
/home/accdias/.local
/home/accdias/Wallpapers
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...