Linux: 특정 문자의 첫 번째 인스턴스만 대상으로 하면서 루프에서 파일 이름을 바꿉니다.

Linux: 특정 문자의 첫 번째 인스턴스만 대상으로 하면서 루프에서 파일 이름을 바꿉니다.

이 스레드(https://superuser.com/questions/659876/how-to-rename-files-and-replace-characters)은 풍부한 것으로 입증되었으며 파일 이름에서 문자의 첫 번째 인스턴스를 바꿔야 한다는 점을 제외하고는 필요한 작업을 수행합니다.

어떻게 해야 하나요?

for f in *:*; do mv -v "$f" $(echo "$f" | tr '.' '_'); done

.다음과 같이 filename 의 첫 번째 인스턴스만 바꿉니다 .

2022-10-07T071101.8495077Z_QueryHistory.txt

답변1

불행하게도 시도하고 있는 방법은 필요한 것보다 더 복잡하고 취약합니다(파일 이름에 특정 특수 문자가 포함된 경우 충돌이 발생함). 이는 다음을 기반으로 하는 더 간단한 접근 방식입니다.매개변수 확장변환 파일 이름:

for f in *; do mv -v -- "$f" "${f/./_}"; done   # replace the first .
for f in *; do mv -v -- "$f" "${f//./_}"; done  # replace every .

이를 위해서는 쉘로 bash, ksh 또는 zsh가 필요합니다. dash(Ubuntu의 , 스크립팅에 자주 사용되지만 대화식으로 거의 사용되지 않음)와 같은 다른 쉘에는 매개변수 확장 형식이 /bin/sh없습니다 .${VARIABLE/PATTERN/REPLACEMENT}

prename또는 ( )를 사용할 수 있습니다 apt install rename.

rename 's/\./_/' *     # replace the first .
rename 's/\./_/g' *    # replace every .

또는 다음을 사용할 수 있습니다.다루기 힘든~의즈마브:

autoload -U zmv   # put this in your .zshrc
zmv '*' '${f/./_}'        # replace the first .
zmv -W '*.*.*' '*_*.*'    # replace the next-to-last .
zmv '*' '${f//./_}'       # replace every .

내 대답의 모든 조각은 이름이 점으로 시작하는 파일을 건너뜁니다.

답변2

사용rename명령줄:

    rename -n 's/\./_/' ./2022-10-07T071101.8495077Z_QueryHistory.txt

출력이 만족스러우면 제거하십시오 -n(일명).dry-run

관련 정보