技術メモ、Tips、忘備録

技術系のメモ、試してみたこと、その他

階層が深いディレクトリから同名ファイルを探し出して上書きする

前置き

仕事中にタイトルのようなことがしたいことがありました。
例えば、普段の作業はローカルで行い、ファイルサーバにコピーするときに、エクスプローラでいちいちファイルの場所まで開く必要があります。
別に大した手間ではないのですが、よく考えると面倒だし、なんでファイルのパスまで覚えとかないといけないんだろう。。。と思ってしまったので、それ用の関数を用意することにしました。

スクリプト記述

注意 ここではローカルパスからローカルパスのコピーを行います。前置きでファイルサーバへのコピーと書きましたが、一般的にはそういう使い方の方が多いのかな?と思ってそう書きました。私の実際の用途としてはデプロイ資材の差し替えとかです。

早速Powershellで書いていきます、

function Global:Copy-FileToSameName
{
    param(
        [Parameter(Mandatory, HelpMessage="送り側")]
        [string]$source,

        [Parameter(Mandatory,HelpMessage="受け側")]
        [string]$destination
    )
    # is Exist ?
    $_source = [System.IO.FileInfo]::new("$(Convert-Path -Path $source)")
    $_destination = [System.IO.DirectoryInfo]::new("$(Convert-Path -Path $destination)")
    $file_list = [System.IO.Directory]::GetFiles(
        $_destination.FullName.Split("`""),
        $_source.Name.Split("`""),
        [System.IO.SearchOption]::AllDirectories)

    foreach ($item in $file_list)
    {
        if ($item -ne $_source.FullName.Split("`""))
        {
            Copy-Item -Path $_source.FullName.Split("`"") -Destination $item

        }
    }
}

こんな感じでしょうか。ちなみに引数でFileInfoやDirectoyrInfo型ではなくstring型で受けたのは理由があります。
それはまた今度記事にしようと思います。

動作確認

  1. コピー元ファイルが存在するディレクトリで、そのディレクトリの配下にある別の同名ファイルに上書き
  2. コピー元ファイルが存在しないディレクトリで、そのディレクトリの配下にある別の同名ファイルに上書き
  3. コピー先が複数存在する場合
    こんな感じでしょうか。
    ではまず準備です。以下のような構造でディレクトリを用意します。
C:\DEVELOP\TMP_SCRIPT\SCRIPT\1\TEST
├─1
│  │  file1.txt
│  │
│  └─parent
│      ├─child
│      │      file1.txt
│      │      file2.txt
│      │
│      └─child2
│              file3.txt
│              file4.txt
│
├─2
│  └─parent
│      ├─child
│      │      file1.txt
│      │      file2.txt
│      │
│      └─child2
│              file3.txt
│              file4.txt
│
└─3
    └─parent
        ├─child
        │      file1.txt
        │      file2.txt
        │
        └─child2
                file1.txt
                file4.txt

ファイルの更新確認は、gitで差分確認しましょう。
現在の状態です。差分はないです。
f:id:monkey999por:20200828113234p:plain
実行してみます。

Copy-FileToSameName -source .\test\1\file1.txt -destination .\test\1\
Copy-FileToSameName -source .\file1.txt -destination .\test\2\
Copy-FileToSameName -source .\file1.txt -destination .\test\3\

f:id:monkey999por:20200828113732p:plain
大丈夫そうですね。 ファイルの中身も確認して正常にコピーされていました。(画像だらけになるので張りません、、)
今回のスクリプト等は、tmp_scriptに置いてあります。
読んでいただきありがとうございました。

・免責事項

当方は、当記事にコンテンツを掲載するにあたって、その内容、機能等について細心の注意を払っておりますが、コンテンツの内容が正確であるかどうか、最新のものであるかどうか、安全なものであるか等について保証をするものではなく、何らの責任を負うものではありません。また、当方は通知することなく当記事に掲載した情報の訂正、修正、追加、中断、削除等をいつでも行うことができるものとします。また、当記事、またはコンテンツのご利用により、万一、ご利用者様に何らかの不都合や損害が発生したとしても、当方は何らの責任を負うものではありません。