web-dev-qa-db-ja.com

ファイル名の一部で名前が付けられたフォルダにファイルを移動します

画像や動画を表すGoProFusionカメラのファイルがあります。ファイル名は次のようになります

GP(「GoPro」の場合)(特に重要ではない2文字)(一連の数字;おそらく4桁または6桁)(ピリオド)(拡張)

JPGMP4WAVなど、一部の拡張機能は一般的なものです。他は珍しいです。ファイル名の例としては、GPFR0000.jpgGPBK0000.jpgGPFR0000.gprGPFR1153.MP4GPFR1153.THMGPBK142857.WAVがあります。ただし、拡張子はこの質問には関係ありません。

画像と映画ごとに、拡張子の直前に名前が同じ一連の数字を持つファイルのセットがあります。したがって、たとえば、GPFR1153.LRVGPBK1153.MP4は同じセットに属します。

各セットのすべてのファイルを、名前がGPの後に一連の数字が続くディレクトリにグループ化する必要があります。たとえば、私が持っている場合

GPFR0000.jpg
GPBK0000.jpg
GPFR0000.gpr
GPFR0000.gpr
GPFR1153.LRV
GPFR1153.MP4
GPFR1153.THM
GPBK1153.WAV
GPBK1153.MP4
GPQZ142857.FOO

すべてを1つのディレクトリにまとめると、結果は次のようになります。

GP0000\GPFR0000.jpg
GP0000\...
GP1153\GPFR1153.LRV
GP1153\GPFR1153.MP4
GP1153\...
GP142857\GPQZ142857.FOO

これはスクリプト(Windows 10の場合)で可能でしょうか?この(PowerShell)スクリプトを mousio at 何千ものファイルをサブフォルダーウィンドウに再帰的に移動する で見つけましたが、少し異なる問題に対処しているので、それに適応させたいと思います。私の要件(私はアーティストであり、プログラマーではありません)。

# if run from "P:\Gopro\2018", we can get the image list
$images = dir *.jpg

# process images one by one
foreach ($image in $images)
{
    # suppose $image now holds the file object for "c:\images\GPBK1153.*"

    # get its file name without the extension, keeping just "GPBK1153"
    $filenamewithoutextension = $image.basename

    # group by 1 from the end, resulting in "1153"
    $destinationfolderpath = 
        $filenamewithoutextension -replace '(....)$','\$1'

    # silently make the directory structure for "1153 GPBK1153"
    md $destinationfolderpath >$null

    # move the image from "c:\images\1234567890.jpg" to the new folder "c:\images\1\234\567\890\"
    move-item $image -Destination $destinationfolderpath

    # the image is now available at "P:\Gopro\2018\1153\GPBK1153.*"
}
2
Florian Frey

必要なものについての私の(おそらく欠陥のある)理解に基づいて、次のPowerShellスクリプトを使用してそれを行うことができます。これは mousio による作業から派生したものであり、 何千ものファイルをサブフォルダーウィンドウに再帰的に移動する に投稿されていることに注意してください。

# If run from "P:\Gopro\2018", we can get the file list.
$images = dir GP*

# Process files one by one.
foreach ($image in $images)
{
    # Suppose $image now holds the file object for "P:\Gopro\2018\GPBK1153.FOO"

    # Get its file name without the extension, keeping just "GPBK1153".
    $filenamewithoutextension = $image.basename

    # Grab the first two characters (which we expect to be "GP"),
    # skip the next two characters (which we expect to be letters; e.g., "BK"),
    # then grab all the characters after that (which we expect to be digits; e.g., "1153")
    # and put them together, resulting in "GP1153".
    $destinationfolderpath = 
        $filenamewithoutextension -replace '(..)..(.*)','$1$2'

    # Silently make the directory structure for "GP1153".
    md $destinationfolderpath > $null 2>&1

    # Move the file from "P:\Gopro\2018\GPBK1153.FOO" to the new folder "P:\Gopro\2018\GP1153"
    move-item $image -Destination $destinationfolderpath

    # The file is now available at "P:\Gopro\2018\GP1153\GPBK1153.FOO".
}
0
Scott