ファイルのセットが命名スキームに準拠していることを確認する方法
-
09-06-2019 - |
質問
特定の命名/編成スキームと一致するかどうかを確認したいファイル (テレビのエピソードですが、かなり任意です) がたくさんあります。
現在:正規表現の配列が 3 つあり、1 つは有効なファイル名用、1 つはエピソード名が欠落しているファイル用、もう 1 つは有効なパス用です。
次に、各有効なファイル名の正規表現をループし、一致する場合は「有効な」辞書に追加します。一致しない場合は、欠落しているep-nameの正規表現で同じことを行い、一致する場合は「無効な」辞書に追加します。 " エラー コード (2:'エピソード名がありません') を含む辞書。どちらにも一致しない場合、'不正な形式の名前' エラー コードで無効に追加されます。
現在のコードが見つかります ここ
各ディレクトリにfolder.jpgファイルが存在するかどうかをチェックするルールを追加したいのですが、これを追加すると、現在の状態ではコードがかなり煩雑になります。
このシステムをより拡張可能な方法で作成するにはどうすればよいでしょうか?
チェックする必要があるルールは次のとおりです。
- ファイルの形式は次のとおりです
Show Name - [01x23] - Episode Name.avi
またはShow Name - [01xSpecial02] - Special Name.avi
またはShow Name - [01xExtra01] - Extra Name.avi
- ファイル名が次の形式の場合
Show Name - [01x23].avi
出力の「欠落しているエピソード名」セクションに表示します - パスは次の形式である必要があります。
Show Name/season 2/the_file.avi
(シーズン 2 はファイル名の正しいシーズン番号である必要があります) - それぞれ
Show Name/season 1/
フォルダーには「folder.jpg」が含まれている必要があります
。何か案は?テレビのエピソードをチェックしようとしているときに、この概念/コードは多くのものに適用できるはずです。
私が考えていた唯一の考えは、次の形式の辞書のリストでした。
checker = [
{
'name':'valid files',
'type':'file',
'function':check_valid(), # runs check_valid() on all files
'status':0 # if it returns True, this is the status the file gets
}
解決
各ディレクトリにFolder.jpgファイルの存在をチェックするルールを追加したいのですが、これを追加すると、コードが現在の状態で大幅に乱雑になります。
これは悪くないようです。実際、現在のコードはそれを非常にうまく実行しており、Sven はそれを行うための良い方法についても言及しています。
- すべてのファイルのリストを取得する
- 「必要な」ファイルを確認する
必要なファイルのリストを辞書に追加するだけです。
checker = {
...
'required': ['file', 'list', 'for_required']
}
これを行うためのより良い/拡張可能な方法はあるのでしょうか?正確にはわかりません。私が本当に思いついた方法は、「複数の」正規表現を削除し、区切り文字を使用するという Sven のアイデアを基にする方法だけでした。したがって、私の戦略は次のように辞書を定義することです (申し訳ありませんが、私は Python 構文を知りませんし、調べるのが少し怠けていますが、意味はわかるはずです。/regex/ は正規表現の短縮形です)。
check_dict = {
'delim' : /\-/,
'parts' : [ 'Show Name', 'Episode Name', 'Episode Number' ],
'patterns' : [/valid name/, /valid episode name/, /valid number/ ],
'required' : ['list', 'of', 'files'],
'ignored' : ['.*', 'hidden.txt'],
'start_dir': '/path/to/dir/to/test/'
}
- 区切り文字に基づいてファイル名を分割します。
- 各部を確認してください。
これは順序付きリストであるため、どの部分が欠落しているかを判断でき、セクションがどのパターンにも一致しない場合はそのセクションが不正であると判断できます。ここで、 parts
そして patterns
1対1の比率になります。辞書の代わりに 2 つの配列を使用すると、順序が強制されます。
無視されるファイルと必要なファイルをリストできます。の .
そして ..
ファイルはおそらく自動的に無視されるはずです。ユーザーは、シェルを展開できる「グロブ」を入力できるようにする必要があります。ここで考えているのは svn:ignore
プロパティを使用しますが、ファイルのリストを表示するにはグロビングが自然です。
ここ start_dir
デフォルトは現在のディレクトリですが、単一のファイルで多数のディレクトリの自動テストを実行したい場合は、これが便利です。
ここでの本当の問題点は、パス テンプレートと、同様に「有効なファイル」に必要なパスです。大きな正規表現を 1 つ作成し、そこからグループを取得しない限り、確かなアイデアを思いつくことはできませんでした...テンプレートを構築します。TextMate 言語の文法を書くのとよく似た感じでした。しかし、それは使いやすさの面で迷い始めます。本当の問題は、パス テンプレートが次のもので構成されていないことでした。 parts
, これは理にかなっていますが、複雑さが増します。
この戦略はあなたが考えていたものと一致していますか?
他のヒント
おそらく、デフォルトを次のように設定するアプローチを取る必要があります。「ファイル名は正しい」と述べ、そこからそのステートメントを反証します。
ただし、次のようなファイル名のみが許可されます。「番組名」、「シーズン番号 x エピソード番号」、および「エピソード名」。これらの項目は「-」(ダッシュ)で区切る必要があることがわかっているため、ファイル名を正しくするには、これらの項目が 2 つ必要です。
それがチェックアウトされたら、コードを使用して、番組名が親の親フォルダーに表示される番組名と一致することを確認できます(大文字と小文字は区別されないと思います)、シーズン番号は親フォルダーの数値と一致します(追加の0の有無にかかわらず)先頭に追加されます)。
ただし、正しい量のダッシュが表示されない場合は、何か問題があることがすぐにわかり、残りのテストなどを行う前に停止します。
ファイルかどうかを個別に確認できます folder.jpg
存在し、必要な措置を講じます。 または 最初にそれを実行し、そのフォルダー内の残りのファイルからそのファイルをフィルターします。