アニメ『ひとりじめマイヒーロー』
居場所がなくて不良グループのパシリになってた主人公を救ったヒーロー。BLでしょうか。BLですねきっと。BLでも面白いです。
今回はファイルコピーネタです。フォルダ内の特定ファイルを、不良グループから救いだすように、コピーしてみましょう。
(本記事はPowerShell入門記事としてコチラにもまとめています。)
元のフォルダの構成です。
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>
目的のファイルの差は出なかったので合ってますね。


コメント