GNU/Linux >> Linux の 問題 >  >> Linux

ディレクトリを検索し、正規表現に一致するファイルを見つけるにはどうすればよいですか?

import os
import re

rootdir = "/mnt/externa/Torrents/completed"
regex = re.compile('(.*zip$)|(.*rar$)|(.*r01$)')

for root, dirs, files in os.walk(rootdir):
  for file in files:
    if regex.match(file):
       print(file)

以下のコードは、次のコメントで質問に答えます

<ブロック引用>

それは本当にうまくいきました.正規表現グループ1で一致が見つかった場合にこれを行う方法はありますか?正規表現グループ2などで一致が見つかった場合はこれを行いますか? – ニレニルソン

import os
import re

regex = re.compile('(.*zip$)|(.*rar$)|(.*r01$)')
rx = '(.*zip$)|(.*rar$)|(.*r01$)'

for root, dirs, files in os.walk("../Documents"):
  for file in files:
    res = re.match(rx, file)
    if res:
      if res.group(1):
        print("ZIP",file)
      if res.group(2):
        print("RAR",file)
      if res.group(3):
        print("R01",file)

より良い方法でこれを行うことは可能かもしれませんが、これはうまくいきます。


glob を使用した代替方法を次に示します。 .

from pathlib import Path

rootdir = "/mnt/externa/Torrents/completed"
for extension in 'zip rar r01'.split():
    for path in Path(rootdir).glob('*.' + extension):
        print("match: " + path)

あなたが初心者であることを考えると、 glob を使用することをお勧めします すばやく作成された file-walking-regex マッチャーの代わりに。

glob を使用した関数のスニペット そして file-walking-regex matcher

以下のスニペットには、2 つのファイル正規表現検索関数が含まれています (1 つは glob を使用します)。 もう 1 つはカスタムの file-walking-regex マッチャーを使用します)。このスニペットには、2 つの関数の時間を計る「ストップウォッチ」関数も含まれています。

import os
import sys
from datetime import timedelta
from timeit import time
import os
import re
import glob

def stopwatch(method):
    def timed(*args, **kw):
        ts = time.perf_counter()
        result = method(*args, **kw)
        te = time.perf_counter()
        duration = timedelta(seconds=te - ts)
        print(f"{method.__name__}: {duration}")
        return result
    return timed

@stopwatch
def get_filepaths_with_oswalk(root_path: str, file_regex: str):
    files_paths = []
    pattern = re.compile(file_regex)
    for root, directories, files in os.walk(root_path):
        for file in files:
            if pattern.match(file):
                files_paths.append(os.path.join(root, file))
    return files_paths


@stopwatch
def get_filepaths_with_glob(root_path: str, file_regex: str):
    return glob.glob(os.path.join(root_path, file_regex))

上記の関数の実行時間の比較

上記の 2 つの関数を使用して、正規表現 filename_*.csv に一致する 5076 個のファイルを見つける root_path というディレクトリに (66,948 ファイルを含む):

>>> glob_files = get_filepaths_with_glob(root_path, 'filename_*.csv')
get_filepaths_with_glob: 0:00:00.176400

>>> oswalk_files = get_filepaths_with_oswalk(root_path,'filename_(.*).csv')
get_filepaths_with_oswalk: 0:03:29.385379

glob メソッドははるかに高速で、そのコードは短くなります。

あなたの場合

あなたの場合、おそらく次のようなものを使用して *.zip を取得できます ,*.rar および *.r01 ファイル:

files = []
for ext in ['*.zip', '*.rar', '*.r01']:
    files += get_filepaths_with_glob(root_path, ext) 

私ならこうします:

import re
from pathlib import Path

def glob_re(path, regex="", glob_mask="**/*", inverse=False):
    p = Path(path)
    if inverse:
        res = [str(f) for f in p.glob(glob_mask) if not re.search(regex, str(f))]
    else:
        res = [str(f) for f in p.glob(glob_mask) if re.search(regex, str(f))]
    return res

注:デフォルトでは、すべてのサブディレクトリを再帰的にスキャンします。現在のディレクトリのみをスキャンする場合は、明示的に glob_mask="*" を指定する必要があります


Linux
  1. Unix で空のディレクトリとファイルを見つけて削除する方法

  2. すべてのファイルとディレクトリを再帰的に一覧表示する方法

  3. Linuxシェルスクリプトで正規表現を使用してファイルを検索する方法

  1. Linuxでトップディレクトリとファイル(ディスク容量)を見つける方法

  2. Linuxでディレクトリを再帰的に検索および削除する方法

  3. 特定のユーザーが書き込み可能なすべてのファイルとディレクトリを見つけるにはどうすればよいですか?

  1. プロのようにLinuxでファイルとディレクトリを探す

  2. Ubuntuでファイルを見つける方法は?

  3. サイズと拡張子でファイルを検索する方法は?