Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Linux
- APM
- kotlin
- CloudWatch
- Pinpoint
- 정보처리기사실기 기출문제
- Java
- Elasticsearch
- mysql 튜닝
- minikube
- kotlin spring
- 공부
- 티스토리챌린지
- AI
- Kubernetes
- IntelliJ
- kotlin querydsl
- 정보처리기사 실기
- aws
- 정보처리기사 실기 기출문제
- 코틀린 코루틴의 정석
- kotlin coroutine
- 기록으로 실력을 쌓자
- CKA
- Spring
- CKA 기출문제
- 오블완
- MySQL
- AWS EKS
- PETERICA
Archives
- Today
- Total
피터의 개발이야기
[Kotlin] Kotlin으로 Shell 유틸리티 만들기: 파일 복사와 압축 본문
반응형
ㅁ 들어가며
ㅇ 대량의 파일을 JVM에서 처리할 경우 OOME의 위험이 있어, 커널에서 직접 처리하기로 결정되었다.
ㅇ kotlin에서 커널에 명령을 줄 수 있고, 이를 Kotlin에서 간편하게 쓸 수 있는 방법을 찾고 있다.
ㅇ kotlin으로 shell 명령어를 사용하여 파일을 복사하고 압축하는 util을 만들어 보았다.
ㅁ ShellUtil.kt
import java.io.File
object ShellUtil {
/**
* cp 명령을 사용하여 파일을 복사한다.
* 원본 파일 경로와 대상 경로를 인자로 받는다.
* -r: 디렉토리 복사(없으면 생성)
*/
fun copyFile(source: String, destination: String): Boolean {
val command = "cp $source $destination"
println(command)
return executeCommand(command)
}
/**
* zip 명령을 사용하여 파일을 압축한다.
* 압축할 파일 경로와 압축 결과 파일 경로를 인자로 받는다.
*/
fun compressFile(source: String, destination: String): Boolean {
val command = "zip -r $destination $source"
println(command)
return executeCommand(command)
}
/**
* 압축 파일 무결성 검사를 진행한다.
* 압축된 파일 경로를 인자로 받는다.
* $ unzip -t file.zip
* Archive: file.zip
* testing: source/CODE1/test1.png OK
* No errors detected in compressed data of file.zip.
*/
fun checkZipFile(destination: String): Boolean {
val command = "unzip -t $destination"
println(command)
return executeCommand(command)
}
/**
* 실제 shell 명령을 실행하는 private 함수이다.
* Runtime.getRuntime().exec()를 사용하여 명령을 실행한다.
* 명령 실행 결과를 boolean 값으로 반환한다 (성공: true, 실패: false).
*/
private fun executeCommand(command: String): Boolean {
return try {
val process = Runtime.getRuntime().exec(command)
val exitCode = process.waitFor()
exitCode == 0
} catch (e: Exception) {
println("Error executing command: ${e.message}")
false
}
}
}
ㅁ 사용 예
fun main() {
val sourceFile = "source/CODE1/test1.png"
val destinationFile = "source/CODE1/test3.png"
val compressedFile = "compressed/file.zip"
// 파일 복사
if (ShellUtil.copyFile(sourceFile, destinationFile)) {
println("파일 복사 성공")
} else {
println("파일 복사 실패")
}
// 파일 압축
if (ShellUtil.compressFile(sourceFile, compressedFile)) {
println("파일 압축 성공")
} else {
println("파일 압축 실패")
}
// 압축 파일 무결성 검사
if (ShellUtil.checkZipFile(compressedFile)) {
println("압축 무결성 검사 성공")
} else {
println("압축 무결성 검사 실패")
}
}
출력:
cp source/CODE1/test1.png source/CODE1/test3.png
파일 복사 성공
zip -r compressed/file.zip source/CODE1/test1.png
파일 압축 성공
unzip -t compressed/file.zip
압축 무결성 검사 성공
ㅁ 마무리
이 코드는 Linux나 macOS 같은 Unix 기반 시스템에서 동작한다. Windows에서는 다른 명령어를 사용해야 할 수 있다.
이 유틸리티 클래스를 사용하면 Kotlin 코드 내에서 간단하게 파일 복사와 압축 작업을 수행할 수 있다.
필요에 따라 다른 shell 명령어도 추가하여 기능을 확장할 수 있다.
ㅁ 함께 보면 좋은 사이트
반응형
'Programming > Kotlin' 카테고리의 다른 글
[Kotlin] QueryDSL java.lang.NoSuchFieldError: TREATED_PATH (0) | 2024.07.20 |
---|---|
[Kotlin] Spring에 MapStruct와 Lombok을 함께 사용할 때 isCompleted 필드가 null로 넘어오는 문제 (0) | 2024.07.19 |
[Kotlin] kotlin에서 shell 실행하기 (0) | 2024.07.17 |
[Kotlin] QueryDSL에서 YYYY-MM로 검색하기 (1) | 2024.07.16 |
[Kotlin] ManagementFactory을 이용한 JVM 모니터링 방법 (1) | 2024.07.14 |
Comments