stamper
파일이름변경rename일괄

파일 이름 한꺼번에 바꾸기

개발자김철수2026. 7. 21.조회 91추천 0
변수 입력3

파일 이름 일괄 변경은 충돌, 덮어쓰기, 공백·개행 문자 때문에 예상치 못한 결과가 생길 수 있습니다. 실제 변경 전에 반드시 old -> new 목록을 만들고 중복 대상이 없는지 확인하세요.

{{DIR}} 안의 파일 이름에서 {{FROM}}{{TO}}로 일괄 변경하려고 해.
현재 이름과 변경될 이름을 먼저 출력하고, 대상 이름 충돌과 덮어쓰기를 막은 뒤 실행하는 안전한 방법을 알려 줘.
macOS와 Linux에서 rename 명령 구현이 다를 수 있으므로 POSIX shell 방식으로 작성해 줘.

1. 대상 목록 확인

find '{{DIR}}' -maxdepth 1 -type f -print

2. dry-run으로 변경 이름 계산

다음 예시는 파일명 문자열에서 첫 번째 {{FROM}}{{TO}}로 바꿉니다.

find '{{DIR}}' -maxdepth 1 -type f -exec sh -c '
  for old do
    base=${old##*/}
    dir=${old%/*}
    new_base=$(printf "%s\n" "$base" | sed "s/{{FROM}}/{{TO}}/")
    new=$dir/$new_base
    [ "$old" = "$new" ] || printf "%s -> %s\n" "$old" "$new"
  done
' sh {} +

{{FROM}}{{TO}}/, &, 정규식 문자가 들어가면 sed escaping이 필요합니다. 복잡한 규칙은 shell 한 줄 명령보다 Python 등으로 명시적인 변환·충돌 검사를 작성하는 편이 안전합니다.

3. 충돌을 막고 실행

find '{{DIR}}' -maxdepth 1 -type f -exec sh -c '
  for old do
    base=${old##*/}
    dir=${old%/*}
    new_base=$(printf "%s\n" "$base" | sed "s/{{FROM}}/{{TO}}/")
    new=$dir/$new_base
    [ "$old" = "$new" ] && continue
    if [ -e "$new" ]; then
      printf "건너뜀(대상 존재): %s\n" "$new" >&2
      continue
    fi
    mv -- "$old" "$new"
  done
' sh {} +

4. 결과 확인과 복구

변경 후 다시 목록을 저장해 dry-run 출력과 비교하세요.

find '{{DIR}}' -maxdepth 1 -type f -print

중요한 파일이라면 실행 전 목록과 백업을 만들거나 Git으로 추적되는지 확인하세요. rename 명령은 배포판마다 문법이 다르므로 설치된 구현을 확인하지 않고 예제를 복사하면 안 됩니다.

확인 기준: man find, man mv, man sed

댓글 0

아직 댓글이 없습니다.