Introduction

Dockerfileで COPY コマンドがシンボリックリンクを認識できないことに気付き、ビルド時の対処ディレクトリをどう手元に持ってくるかと悩んでいました。
ビルドディレクトリの変更が楽なんですが、ちょっと事情があってそれは嫌だと。

なんで特定のディレクトリを無視したいかというと、 binobj のいわゆる成果物が含まれるディレクトリが重いためです。

How to do?

かなり議論が白熱している話題でした。

どうも、1コマンドで実行できる手順はなく、パイプでつなぐなどしかない模様。
色々、試した結果下記に落ち着きました。
特に、複数のディレクトリを除外するのに、もっと綺麗な方法があるはずですが、あまり詳しく調べるのも面倒なので…

1
2
3
4
5
6
7
8
9
10
$exclude1 = @('bin')
$exclude2 = @('obj')

$src = "D:\test"
$dst = "D:\test2"
New-Item $dst -Type Directory -Force > $null
Get-ChildItem $src -Recurse | `
where {$_.FullName -notmatch $exclude1} | `
where {$_.FullName -notmatch $exclude2} | `
Copy-Item -Destination {Join-Path $dst $_.FullName.Substring($src.length)}

下記の構成です。

1
2
3
4
5
6
7
8
D:\TEST
target.txt

├─bin
sample.txt

└─obj
sample.txt

実行してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PS D:\>$exclude1 = @('bin')
PS D:\>$exclude2 = @('obj')
PS D:\>
PS D:\>$src = "D:\test"
PS D:\>$dst = "D:\test2"
PS D:\>New-Item $dst -Type Directory -Force > $null
PS D:\>Get-ChildItem $src -Recurse | `
>> where {$_.FullName -notmatch $exclude1} | `
>> where {$_.FullName -notmatch $exclude2} | `
>> Copy-Item -Destination {Join-Path $dst $_.FullName.Substring($src.length)}
PS D:\>Get-ChildItem $dst


ディレクトリ: D:\test2


Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2021/03/14 23:46 0 target.txt