포스트

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에 있는 메서드다. 글에서도 짚듯이 진행률 막대는 사용자가 기다려야 할 때만 의미가 있다. 작업이 금방 끝나면 막대가 너무 빨리 그려져 오히려 알아보기 어렵다.

참고한 자료외부 출처 3

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다