2021-01-31-TIL
2021-01-31-TIL
find command
find는 디렉터리 계층을 따라 내려가며 조건에 맞는 파일을 찾는 명령어다. 기본 형태는 find [시작 경로] [조건식]이고, 시작 경로 아래의 모든 파일에 조건식을 차례로 적용한다. man 페이지 기준으로 자주 쓰는 조건은 다음과 같다.
-name pattern: 경로를 뺀 파일 이름이 셸 패턴과 맞는지 본다. 패턴은 셸이 먼저 펼치지 않도록 따옴표로 감싼다.-type f,-type d: 일반 파일만, 디렉터리만 고른다.-mtime n: 마지막 수정 시각으로 고른다.-mtime -7은 7일(7 × 24시간) 이내,+7은 그보다 오래된 파일이다.-exec command {} \;: 찾은 파일마다 명령을 실행한다.{}자리에 파일 이름이 들어간다.-exec command {} +: 찾은 파일 이름을 모아 명령 끝에 붙여 실행한다. 명령 실행 횟수가 줄어든다.
1
2
3
find . -name "*.md" -type f # 현재 디렉터리 아래 마크다운 파일
find ./logs -name "*.log" -mtime +30 # 30일보다 오래된 로그
find . -name "*.class" -exec rm {} + # 컴파일 결과물 삭제
-exec rm은 되돌릴 수 없으므로, 같은 조건으로 먼저 목록만 출력해 확인한 뒤 붙이는 편이 안전하다.
Progress Bar in Java
콘솔에 진행률 막대를 그리는 핵심은 줄바꿈(\n) 대신 캐리지 리턴(\r)을 쓰는 것이다. JLS에서 \r은 CR(carriage return) 문자를 나타내는 이스케이프 시퀀스다. 위 글의 설명대로 이 문자를 출력하면 커서가 같은 줄의 첫 위치로 돌아가므로, 그 위에 새 막대를 덮어써서 같은 줄이 갱신되는 것처럼 보인다. 그래서 println()이 아니라 print()로 출력한다.
1
2
3
4
5
6
7
for (int percent = 0; percent <= 100; percent++) {
int filled = percent / 2; // 50칸 기준
String bar = "#".repeat(filled) + " ".repeat(50 - filled);
System.out.print("\r" + bar + " " + percent + "%");
Thread.sleep(50);
}
System.out.println();
String.repeat()는 Java 8 API에는 없고 Java 11 API에 있는 메서드다. 글에서도 짚듯이 진행률 막대는 사용자가 기다려야 할 때만 의미가 있다. 작업이 금방 끝나면 막대가 너무 빨리 그려져 오히려 알아보기 어렵다.
이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.
댓글
아직 댓글이 없습니다