アニメ『ひとりじめマイヒーロー』
居場所がなくて不良グループのパシリになってた主人公を救ったヒーロー。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>
目的のファイルの差は出なかったので合ってますね。
コメント