PowerShell(必要なファイルだけTreeコピー)


アニメ『ひとりじめマイヒーロー』
居場所がなくて不良グループのパシリになってた主人公を救ったヒーロー。BLでしょうか。BLですねきっと。BLでも面白いです。
今回はファイルコピーネタです。フォルダ内の特定ファイルを、不良グループから救いだすように、コピーしてみましょう。
元のフォルダの構成です。

PS C:\Users\takk\aaa> tree /f
フォルダー パスの一覧
ボリューム シリアル番号は 0000005E C288:F709 です
C:.
└─dir1
    ├─1295
    │  └─1272
    │      └─13
    │              file6.txt
    │
    ├─1598
    │  └─7997
    │      └─42
    │              file3.txt
    │
    ├─1689
    │  └─0633
    │      └─86
    │              file4.txt
    │
    ├─1955
    │  └─2146
    │      └─92
    │              file7.txt
    │
    ├─2310
    │  └─6227
    │      └─6
    │              file1.txt
    │
    ├─2602
    │  └─6181
    │      └─6
    │              file5.txt
    │
    ├─4748
    │  └─0337
    │          file10.txt
    │
    ├─4829
    │  └─4788
    │      └─5
    │              file9.txt
    │
    ├─6104
    │  └─6524
    │      └─2
    │              file8.txt
    │
    └─6827
        └─0945
            └─3
                    file2.txt

PS C:\Users\takk\aaa>

特定のファイルがあるディレクトリのみ抽出してみます。

PS C:\Users\takk\aaa> gci dir1 -name -re -i file[135].txt | % { $_ -replace "[^\\]*$","" }
1598\7997\42\
2310\6227\6\
2602\6181\6\
PS C:\Users\takk\aaa>

抽出したディレクトリをコピーします。

PS C:\Users\takk\aaa> gci dir1 -name -re -i file[135].txt | % { $needs=$_ -replace "[^\\]*$","";mkdir "dir2\$needs" | ou
t-null }
PS C:\Users\takk\aaa>

コピーできたようです。

PS C:\Users\takk\aaa> gci dir2 -name -re
1598
2310
2602
1598\7997
1598\7997\42
2310\6227
2310\6227\6
2602\6181
2602\6181\6
PS C:\Users\takk\aaa>

削除してもう一度。

PS C:\Users\takk\aaa> rm dir2 -re
PS C:\Users\takk\aaa>

ディレクトリをコピー後、ファイルもコピーします。

PS C:\Users\takk\aaa> gci dir1 -name -re -i file[135].txt | % { $needs=$_ -replace "[^\\]*$","";mkdir "dir2\$needs" | ou
t-null;copy "dir1\$_" "dir2\$_" }

コピーできたか確認しましょう。

PS C:\Users\takk\aaa> gci dir2 -name -re
1598
2310
2602
1598\7997
1598\7997\42
1598\7997\42\file3.txt
2310\6227
2310\6227\6
2310\6227\6\file1.txt
2602\6181
2602\6181\6
2602\6181\6\file5.txt
PS C:\Users\takk\aaa>

Compare-Objectでパスが一致しているか確認します。

PS C:\Users\takk\aaa> $dir1=gci dir1 -name -re -file
PS C:\Users\takk\aaa> $dir2=gci dir2 -name -re -file
PS C:\Users\takk\aaa> diff $dir1 $dir2

InputObject                                                 SideIndicator
-----------                                                 -------------
1295\1272\13\file6.txt                                      <=
1689\0633\86\file4.txt                                      <=
1955\2146\92\file7.txt                                      <=
4748\0337\file10.txt                                        <=
4829\4788\5\file9.txt                                       <=
6104\6524\2\file8.txt                                       <=
6827\0945\3\file2.txt                                       <=


PS C:\Users\takk\aaa>

合ってそうです。

ではコピー処理を関数化します。

function fcopy($srcdir, $destdir,$pattern){
	gci $srcdir -name -re -i $pattern | % {
		$needs=$_ -replace "[^\\]*$","";mkdir -force "$destdir\$needs" | out-null
		copy "$srcdir\$_" "$destdir\$_"
	}
}

fcopyという関数名にしました。使ってみましょう。

PS C:\Users\takk\aaa> dir -name
dir1

dir1しかないことを確認して、fcopyを実行します。

PS C:\Users\takk\aaa> fcopy dir1 dir2 file[1-5].txt
PS C:\Users\takk\aaa> dir -name
dir1
dir2
PS C:\Users\takk\aaa>

dir2ができました。中身を確認します。

PS C:\Users\takk\aaa> gci dir2 -name -re -file
1598\7997\42\file3.txt
1689\0633\86\file4.txt
2310\6227\6\file1.txt
2602\6181\6\file5.txt
6827\0945\3\file2.txt
PS C:\Users\takk\aaa>

file1.txt~5.txtまでコピーされていますね。 dir1と比較して確認します。

PS C:\Users\takk\aaa> $dir1=gci dir1 -name -re -file
PS C:\Users\takk\aaa> $dir2=gci dir2 -name -re -file
PS C:\Users\takk\aaa> diff $dir1 $dir2

InputObject                                                 SideIndicator
-----------                                                 -------------
1295\1272\13\file6.txt                                      <=
1955\2146\92\file7.txt                                      <=
4748\0337\file10.txt                                        <=
4829\4788\5\file9.txt                                       <=
6104\6524\2\file8.txt                                       <=


PS C:\Users\takk\aaa>

目的のファイルの差は出なかったので合ってますね。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA