Microsoft MVP성태의 닷넷 이야기
Windows: 273. Windows 환경의 파일 압축 방법 (tar, Compress-Archive) [링크 복사], [링크+제목 복사],
조회: 5130
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... 46  [47]  48  49  50  51  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12762정성태8/8/202119396Java: 28. IntelliJ - Unable to open debugger port 오류
12761정성태8/8/202116069Java: 27. IntelliJ - java: package javax.inject does not exist [2]
12760정성태8/8/202112848개발 환경 구성: 594. 전용 "Command Prompt for ..." 단축 아이콘 만들기
12759정성태8/8/202117463Java: 26. IntelliJ + Spring Framework + 새로운 Controller 추가 [2]파일 다운로드1
12758정성태8/7/202116864오류 유형: 751. Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
12757정성태8/7/202117474Java: 25. IntelliJ + Spring Framework 프로젝트 생성
12756정성태8/6/202115741.NET Framework: 1084. C# - .NET Core Web API 단위 테스트 방법 [1]파일 다운로드1
12755정성태8/5/202115776개발 환경 구성: 593. MSTest - 단위 테스트에 static/instance 유형의 private 멤버 접근 방법파일 다운로드1
12754정성태8/5/202116174오류 유형: 750. manage.py - Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
12753정성태8/5/202117103오류 유형: 749. PyCharm - Error: Django is not importable in this environment
12752정성태8/4/202113963개발 환경 구성: 592. JetBrains의 IDE(예를 들어, PyCharm)에서 Visual Studio 키보드 매핑 적용
12751정성태8/4/202116886개발 환경 구성: 591. Windows 10 WSL2 환경에서 docker-compose 빌드하는 방법
12750정성태8/3/202113915디버깅 기술: 181. windbg - 콜 스택의 "Call Site" 오프셋 값이 가리키는 위치
12749정성태8/2/202113347개발 환경 구성: 590. Visual Studio 2017부터 단위 테스트에 DataRow 특성 지원
12748정성태8/2/202114370개발 환경 구성: 589. Azure Active Directory - tenant의 관리자(admin) 계정 로그인 방법
12747정성태8/1/202114640오류 유형: 748. 오류 기록 - MICROSOFT GRAPH – HOW TO IMPLEMENT IAUTHENTICATIONPROVIDER파일 다운로드1
12746정성태7/31/202119098개발 환경 구성: 588. 네트워크 장비 환경을 시뮬레이션하는 Packet Tracer 프로그램 소개
12745정성태7/31/202114905개발 환경 구성: 587. Azure Active Directory - tenant의 관리자 계정 로그인 방법
12744정성태7/30/202115293개발 환경 구성: 586. Azure Active Directory에 연결된 App 목록을 확인하는 방법?
12743정성태7/30/202116527.NET Framework: 1083. Azure Active Directory - 외부 Token Cache 저장소를 사용하는 방법파일 다운로드1
12742정성태7/30/202114553개발 환경 구성: 585. Azure AD 인증을 위한 사용자 인증 유형
12741정성태7/29/202116046.NET Framework: 1082. Azure Active Directory - Microsoft Graph API 호출 방법파일 다운로드1
12740정성태7/29/202114549오류 유형: 747. SharePoint - InvalidOperationException 0x80131509
12739정성태7/28/202114973오류 유형: 746. Azure Active Directory - IDW10106: The 'ClientId' option must be provided.
12738정성태7/28/202115923오류 유형: 745. Azure Active Directory - Client credential flows must have a scope value with /.default suffixed to the resource identifier (application ID URI).
12737정성태7/28/202115011오류 유형: 744. Azure Active Directory - The resource principal named api://...[client_id]... was not found in the tenant
... 46  [47]  48  49  50  51  52  53  54  55  56  57  58  59  60  ...