階層が深いディレクトリから同名ファイルを探し出して上書きする
前置き
仕事中にタイトルのようなことがしたいことがありました。
例えば、普段の作業はローカルで行い、ファイルサーバにコピーするときに、エクスプローラでいちいちファイルの場所まで開く必要があります。
別に大した手間ではないのですが、よく考えると面倒だし、なんでファイルのパスまで覚えとかないといけないんだろう。。。と思ってしまったので、それ用の関数を用意することにしました。
スクリプト記述
注意 ここではローカルパスからローカルパスのコピーを行います。前置きでファイルサーバへのコピーと書きましたが、一般的にはそういう使い方の方が多いのかな?と思ってそう書きました。私の実際の用途としてはデプロイ資材の差し替えとかです。
早速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型で受けたのは理由があります。
それはまた今度記事にしようと思います。
動作確認
- コピー元ファイルが存在するディレクトリで、そのディレクトリの配下にある別の同名ファイルに上書き
- コピー元ファイルが存在しないディレクトリで、そのディレクトリの配下にある別の同名ファイルに上書き
- コピー先が複数存在する場合
こんな感じでしょうか。
ではまず準備です。以下のような構造でディレクトリを用意します。
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で差分確認しましょう。
現在の状態です。差分はないです。
実行してみます。
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\
大丈夫そうですね。 ファイルの中身も確認して正常にコピーされていました。(画像だらけになるので張りません、、)
今回のスクリプト等は、tmp_scriptに置いてあります。
読んでいただきありがとうございました。