ファイル名によるファイルの並べ替え

ファイル名によるファイルの並べ替え

Linux スクリプト (Bash) を作成して、ファイルをパターン別にファイル名に分類しようとしています。

私のファイルは主に .JPG で、一部は .AV と .MP4 です。これらのファイルには壊れたタグがあるため (RAID クラッシュから復元)、メタ タグは使用できません。

私のファイルの大部分には、Seaxxx_A01_xxx.jpg や Beach_xxx_A01A02_xxx.jpg や Mountain_xxx_A04A12_xxx.jpg のようなタグが付いています (これは、写真を撮った人やデバイス (カメラ、反射鏡など) を参照するためのものです)。

必要なのは、ファイル名に基づいて、ファイルを正しいフォルダーとサブフォルダーに配置することです。

このタスクを次のように達成できると思います:

find を使用して、パターン [AZ][0-2][0-6] または [AZ][0-2][0-6][AZ][0-2][0-6] を検索します。このパターンが見つかった場合は、ファイル名の最初の部分 (つまり、Sea、beach、mountain、family など、常に最初の単語として配置され、通常はその前に他のものはありません) を検索し、最初の部分を使用して、同様の名前のフォルダーを検索して配置します (ファイルに Sea_Royan_xxx_A04A10_xxx.jpg が含まれており、"Sea" という名前のフォルダーしかない場合は、そのフォルダーに配置する必要があります)。

各フォルダーには、A01、A02、A03、A04 や Dio、Sandy、Mael などのサブフォルダーが存在します。現在見つかったファイル (つまり、親フォルダー、Sea、mountain などに配置されるのに使用されたものと同じファイル) が、上記の 2 番目のパターンに一致しているかどうか確認され、正しいサブフォルダーに配置されるようにしたいと考えています。

実際、もっと簡単に必要なのは、ファイルを検索し、見つかったらファイル名をチェックし、2 つのパターンを使用して適切なフォルダーとサブフォルダーに移動することです。

どうすればいいか教えてください (パターンに基づいてファイルを検索する方法は知っていますが、現在見つかったファイル名を読み取り、このファイル名で 2 つのパターンをチェックして正しい PATH として使用する方法は知りません)。もっと簡単な方法や、もっと良い方法があれば、遠慮なく教えてください。

答え1

ここで 1 つのアプローチを紹介します。ただし、これはおそらく最も美しくも独創的でもないかもしれません。アイデアは、awk で正規表現を使用してファイル名から関連ビットを抽出することです。次に、awk でシェル移動 (mv) コマンドを作成します。最後に、awk で使用可能なシステム コマンドを使用してコマンドを実行し、ファイルを適切なサブフォルダーに移動します。

詳細な説明を取得するには、まずこれを試してください:

find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2];  cmd=("mv " "" filename " "  folder "/" subfolder); print "Command to be run: ", cmd }'

結果:

Command to be run:  mv ./Seaxxx_A01_xxx.jpg ./Seaxxx/A01
Command to be run:  mv ./Mountain_xxx_A04A12_xxx.jpg ./Mountain/A04A12
Command to be run:  mv ./Beach_xxx_A01A02_xxx.jpg ./Beach/A01A02

実際にコマンドを実行するには、ステートメントの最後に system(cmd) を追加します。

find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2];  cmd=("mv " "" filename " "  folder "/" subfolder); print "Command to be run: ", cmd; system(cmd) }'

おそらく必要なのは、正規表現をニーズに合わせて調整することです。正規表現に精通していると仮定して、ここではファイル名の 2 つの部分をキャプチャしています。キャプチャ グループは括弧で囲まれています。

ファイル名の先頭から始めて、アンダースコアが 1 つ見つかるまで、アンダースコア以外のすべてを取得します。次に、パターン A##### が見つかるまで検索を続けます。ここで、# は文字/数字を表します (2 番目のキャプチャ グループ)。次のアンダースコアに到達するまでキャプチャします。

関連情報