ファイル名でファイルを並べ替える

ファイル名でファイルを並べ替える

ファイル名別に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_Royan_xxx_A04A10_xxx.jpgがあり、「Sea」というフォルダだけがある場合はその中に入れる必要があります)。

各フォルダには、A01、A02、A03、A04、またはDio、Sandy、Maelなどのサブフォルダがあり、現在見つかったファイルが必要です(たとえば、親フォルダSeaに配置するために使用されているものと同じ)。ファイル)山など...)正しいサブフォルダを配置するには、上記の2番目のパターンを確認してください。

実際には、より簡単には、ファイルを見つけてファイル名を確認してから、2つのモードを使用して正しいフォルダとサブフォルダに移動する必要があります。

簡単な方法がある場合は、これを行う方法を教えてください(パターンに基づいてファイルを見つける方法を知っていますが、現在見つかったファイル名を読み、このファイル名の両方のパターンを確認して正しいパスとして使用する方法はわかりません。 )。より良い方法を教えてください!

ベストアンサー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) }'

あなたがしたいことの1つは、正規表現を必要に応じて調整することです。私はあなたが正規表現に精通していると仮定します。ここでは、ファイル名の両方の部分をキャプチャします。キャプチャグループは括弧内に表示されます。

ファイル名の先頭から下線が見つかるまで、下線以外のすべてを取得します。次に、A###### パターンが見つかるまで探し続けます。ここで、#は文字/数字(2番目のキャプチャグループ)を表します。次の下線を押すまでキャプチャします。

おすすめ記事