Microsoft MVP성태의 닷넷 이야기
Windows: 273. Windows 환경의 파일 압축 방법 (tar, Compress-Archive) [링크 복사], [링크+제목 복사],
조회: 5334
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

Windows 환경의 파일 압축 방법 (tar, Compress-Archive)

우선, (Windows 10 빌드 17063부터 추가된) tar 먼저 사용해 볼까요? 특정 디렉터리를 압축하려고 할 때 이런 메시지가 나올 수 있습니다.

c:\temp> tar.exe -acf test.zip c:\target\dotnetapp
tar.exe: Removing leading drive letter from member names

// tar: Removing leading '/' from member names

말 그대로 "drive letter"를 압축 파일 경로에서 삭제했다는 건데요, 그래서 목록을 보면 "c:\"는 빠져 있습니다.

c:\temp> tar.exe -ztf test.zip
target/dotnetapp/
target/dotnetapp/dotnetapp.csproj
target/dotnetapp/obj/
target/dotnetapp/Program.cs
target/dotnetapp/obj/dotnetapp.csproj.nuget.dgspec.json
target/dotnetapp/obj/dotnetapp.csproj.nuget.g.props
target/dotnetapp/obj/dotnetapp.csproj.nuget.g.targets
target/dotnetapp/obj/project.assets.json
target/dotnetapp/obj/project.nuget.cache

사실 대부분의 경우 저런 식으로 명령을 내릴 때는 c:\target\dotnetapp의 내용을 압축하긴 하지만, 경로를 그것으로부터 상대적으로 저장하고 싶기를 바랄 것입니다. 그렇게 하려면 대상 디렉터리에 작업 경로를 옮긴 다음 압축을 해야 합니다.

그런데, 이것도 좀 재미있습니다. tar를 다음과 같이 사용해 보면,

c:\temp> cd c:\target\dotnetapp

c:\target\dotnetapp> tar.exe -a -c -f test.zip .

test.zip을 탐색기의 압축 파일 열기로 봤을 때 내용이 하나도 안 나옵니다. 대신 tar로는 확인이 되는데요,

// 윈도우 탐색기로는 안 보이지만, tar로는 확인 가능

c:\target\dotnetapp> tar.exe -ztf test.zip
./
./dotnetapp.csproj
./obj/
./Program.cs
./test.zip
./obj/project.assets.json
./obj/project.nuget.cache
./obj/dotnetapp.csproj.nuget.dgspec.json
./obj/dotnetapp.csproj.nuget.g.props
./obj/dotnetapp.csproj.nuget.g.targets

이 문제는 예전의 탐색기에서 열 수 없었던 현상과 유사해 보입니다. 혹시나 싶어 이번에는 압축 시 대상을 "."가 아닌 "*"로 변형을 했더니 잘됩니다.

// 이렇게 압축한 test.zip은 탐색기에서도 잘 보이고, tar로도 확인 가능

c:\target\dotnetapp> tar.exe -a -c -f test.zip *

c:\target\dotnetapp> tar.exe -ztf test.zip
dotnetapp.csproj
obj/
Program.cs
test.zip
obj/dotnetapp.csproj.nuget.dgspec.json
obj/dotnetapp.csproj.nuget.g.props
obj/dotnetapp.csproj.nuget.g.targets
obj/project.assets.json
obj/project.nuget.cache

비교해 보면 앞에 "./" 경로가 추가됐던 것이 원인임을 추측할 수 있습니다.

더욱 재미있는 건, (경우에 따라) 위의 출력 목록 자체에 0바이트 크기의 "test.zip"이 있는데요, 즉 자기 자신조차도 그 디렉터리에 파일을 생성하게 되므로 함께 포함하게 된다는 점입니다. 이로 인해 확률적으로 오류가 발생하기도 합니다.

c:\target\dotnetapp> tar.exe -a -c -f test.zip .
: Can't add archive to itself

그러니까, 어떤 경우에는 그 자신의 zip 파일도 포함시키고, 어떤 경우는 포함시키지 않게 되는 것입니다.

결국, tar로는 절대 경로든 상대 경로든 압축을 했을 때 뭔가 매끄럽지 않게 되는 면이 있습니다.




자, 그렇다면 윈도우의 PowerShell에서 제공하는 Comperss-Archive는 어떨까요? 우선 절대 경로로 압축을 해 보면,

c:\temp> powershell Compress-Archive c:\target\dotnetapp test.zip

c:\temp> tar.exe -ztf test.zip
dotnetapp/dotnetapp.csproj
dotnetapp/Program.cs
dotnetapp/obj/dotnetapp.csproj.nuget.dgspec.json
dotnetapp/obj/dotnetapp.csproj.nuget.g.props
dotnetapp/obj/dotnetapp.csproj.nuget.g.targets
dotnetapp/obj/project.assets.json
dotnetapp/obj/project.nuget.cache

tar와 유사한 듯하지만, Comperss-Archive는 (루트부터가 아닌) 대상 디렉터리를 포함한 정도로만 압축 파일의 경로에 포함시키고 있습니다. 만약 저것도 없애고 싶다면 "c:\target\dotnetapp"에 "*"만 붙여주면 됩니다.

c:\temp> powershell Compress-Archive c:\target\dotnetapp\* test.zip

c:\temp> tar.exe -ztf test.zip
obj/dotnetapp.csproj.nuget.dgspec.json
obj/dotnetapp.csproj.nuget.g.props
obj/dotnetapp.csproj.nuget.g.targets
obj/project.assets.json
obj/project.nuget.cache
dotnetapp.csproj
Program.cs

완벽하게 상대 경로로 저장이 됐군요. ^^ 이 때문에 굳이 대상 디렉터리로 이동해 작업할 필요가 없습니다. 하지만, Comperss-Archive로 압축한 파일은 내부의 압축 파일 경로를 담을 문자열에서 사용하는 디렉터리 구분자를 윈도우의 '\'로 채택하고 있기 때문에 *NIX 계열과 호환성이 떨어질 수 있습니다.

어느 것 하나 100% 마음에 드는 것이 없군요. ^^;




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 11/25/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 136  137  138  139  140  141  142  143  144  145  146  147  148  149  [150]  ...
NoWriterDateCnt.TitleFile(s)
1303정성태6/26/201227404개발 환경 구성: 152. sysnet DB를 SQL Azure 데이터베이스로 마이그레이션
1302정성태6/25/201229455개발 환경 구성: 151. Azure 웹 사이트에 사용자 도메인 네임 연결하는 방법
1301정성태6/20/201225766오류 유형: 156. KB2667402 윈도우 업데이트 실패 및 마이크로소프트 Answers 웹 사이트 대응
1300정성태6/20/201231785.NET Framework: 329. C# - Rabin-Miller 소수 생성방법을 이용하여 RSACryptoServiceProvider의 개인키를 직접 채워보자 [1]파일 다운로드2
1299정성태6/18/201232897제니퍼 .NET: 21. 제니퍼 닷넷 - Ninject DI 프레임워크의 성능 분석 [2]파일 다운로드2
1298정성태6/14/201234410VS.NET IDE: 72. Visual Studio에서 pfx 파일로 서명한 경우, 암호는 어디에 저장될까? [2]
1297정성태6/12/201231056VC++: 63. 다른 프로세스에 환경 변수 설정하는 방법파일 다운로드1
1296정성태6/5/201227699.NET Framework: 328. 해당 DLL이 Managed인지 / Unmanaged인지 확인하는 방법 - 두 번째 이야기 [4]파일 다운로드1
1295정성태6/5/201225085.NET Framework: 327. RSAParameters와 System.Numerics.BigInteger 이야기파일 다운로드1
1294정성태5/27/201248544.NET Framework: 326. 유니코드와 한글 - 유니코드와 닷넷을 이용한 한글 처리 [7]파일 다운로드2
1293정성태5/24/201229776.NET Framework: 325. System.Drawing.Bitmap 데이터를 Parallel.For로 처리하는 방법 [2]파일 다운로드1
1292정성태5/24/201223755.NET Framework: 324. First-chance exception에 대해 조건에 따라 디버거가 멈추게 할 수는 없을까? [1]파일 다운로드1
1291정성태5/23/201230283VC++: 62. 배열 초기화를 위한 기계어 코드 확인 [2]
1290정성태5/18/201235083.NET Framework: 323. 관리자 권한이 필요한 작업을 COM+에 대행 [7]파일 다운로드1
1289정성태5/17/201239242.NET Framework: 322. regsvcs.exe로 어셈블리 등록 시 시스템 변경 사항 [5]파일 다운로드2
1288정성태5/17/201226467.NET Framework: 321. regasm.exe로 어셈블리 등록 시 시스템 변경 사항 (3) - Type Library파일 다운로드1
1287정성태5/17/201229303.NET Framework: 320. regasm.exe로 어셈블리 등록 시 시스템 변경 사항 (2) - .NET 4.0 + .NET 2.0 [2]
1286정성태5/17/201238233.NET Framework: 319. regasm.exe로 어셈블리 등록 시 시스템 변경 사항 (1) - .NET 2.0 + x86/x64/AnyCPU [5]
1285정성태5/16/201233267.NET Framework: 318. gacutil.exe로 어셈블리 등록 시 시스템 변경 사항파일 다운로드1
1284정성태5/15/201225704오류 유형: 155. Windows Phone 연결 상태에서 DRIVER POWER STATE FAILURE 블루 스크린 뜨는 현상
1283정성태5/12/201233316.NET Framework: 317. C# 관점에서의 Observer 패턴 구현 [1]파일 다운로드1
1282정성태5/12/201226110Phone: 6. Windows Phone 7 Silverlight에서 Google Map 사용하는 방법 [3]파일 다운로드1
1281정성태5/9/201233197.NET Framework: 316. WPF/Silverlight의 그래픽 단위와 Anti-aliasing 처리를 이해하자 [1]파일 다운로드1
1280정성태5/9/201226159오류 유형: 154. Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, ...'.
1279정성태5/9/201224919.NET Framework: 315. 해당 DLL이 Managed인지 / Unmanaged인지 확인하는 방법 [1]파일 다운로드1
1278정성태5/8/201226151오류 유형: 153. Visual Studio 디버깅 - Unable to break execution. This process is not currently executing the type of code that you selected to debug.
... 136  137  138  139  140  141  142  143  144  145  146  147  148  149  [150]  ...