디렉터리의 모든 파일에서 밑줄을 공백으로 바꿉니다.

디렉터리의 모든 파일에서 밑줄을 공백으로 바꿉니다.

디렉토리의 모든 파일에 대해 파일 이름의 밑줄을 공백으로 바꾸고 싶습니다.

나는 이 솔루션을 시도했지만 내가 원하는 것과 반대되는 결과를 얻었습니다.https://stackoverflow.com/questions/1806868/linux-replacing-spaces-in-the-file-names

그러나 공백은 밑줄로 바뀌었습니다. 작동하지 않아 오류가 발생합니다.

´x´ is not a directory

예를 들어 x는 파일 이름의 마지막 단어입니다.hello_world_x

디렉토리의 모든 파일에서 밑줄을 공백으로 바꾸는 올바른 명령은 무엇입니까?

답변1

올바른 디렉토리로 CD를 이동하면 이 스크립트가 사용자의 요구 사항을 안정적으로 해결합니다(확장으로 인해 이식 가능하지 않음 ${var//pat/str}).

#!/bin/bash

set -- *_*
for file; do
    mv -- "$file" "${file//_/ }"
done

*_**_*glob은 이름에 포함된 모든 파일을 선택합니다 ._

set --$1이러한 이름(공백이나 개행 포함)은 간단한 명령 등을 통해 위치 인수로 안정적으로 설정됩니다 .$2set -- "list"

for file;그러면 각 위치 매개변수가 차례로 var 파일에 할당됩니다.

do ... done(각각에 대해) 실행할 명령을 포함합니다 $file.

mv -- "$file" "${file//_/ }"각 파일을 동일한 이름으로 이동(이름 바꾸기)하고 _각각(모두)을 (공백)으로 바꿉니다.

노트-i: 기존 파일을 덮어쓰지 않도록 (대화형) 옵션을 추가할 수 있습니다 . 파일이 존재하는지 mv묻습니다 . 한 가지 주의할 점은 mv사용자와 통신할 수 있는 대화형 셸이 필요하다는 것입니다.

mv -i -- "$file" "${file//_/ }"

답변2

링크한 답변에서 코드를 복사하여 더욱 강력하게 만들었습니다.

for file in *; do mv "$file" "$(echo "$file" | tr '_' ' ')" ; done

mv인용하면 각 파일 이름이 공간 경계에서 손상되지 않고 단일 토큰으로 전달됩니다 .

Perl 기반 이름 바꾸기 유틸리티에 액세스할 수 있는 경우 다음도 작동합니다.

rename -n 's/_/ /g' *

( -n미리보기가 원하는 것과 일치하는지 확인한 후 스위치를 제거하십시오.)

답변3

find . -depth -name "*_*" -exec \
    sh -cf '
        for f do   IFS=_
            IFS=\  set "${f%/*}/"${f##*/}$0
            mv "$f" "$*"
        done
    ' _ {} +

POSIX는 sh구성 변경을 확장합니다.내부 필드 구분 기호.

관련 정보