디렉토리에 있는 모든 파일의 확장자를 어떻게 변경합니까? [복사]

디렉토리에 있는 모든 파일의 확장자를 어떻게 변경합니까? [복사]

현재 디렉터리에 확장자가 없는 파일이 일부 있습니다(파일 이름에 점이 없음).

다음과 같이 이름을 바꾸고 싶습니다.

filename -> filename.md

나는 이것을 시도했지만 mv * *.md도움이되지 않았습니다.

확장명에 대한 인수를 가져와 그에 따라 이름을 바꾸는 함수와 파일에 대한 작업을 수행하는 또 다른 함수에 관심이 있습니다.

답변1

패턴은 명령이 아닌 셸에 의해 일치되므로 시도하는 작업이 작동할 가능성이 없습니다.첫 번째쉘은 모든 파일(확장자가 없는 파일뿐만 아니라 이름에 a가 없는 파일 *에 대해서는 아무 말도 하지 않았습니다 ) 및 이름이 ; 인 모든 파일로 확장됩니다. 그런 다음 쉘은 두 목록의 연결을 명령에 전달합니다..*.md.mdmv

zsh에서

zsh에서 다음 명령을 한 번 실행합니다(나중에 입력하세요 ~/.zshrc).

autoload -U zmv
# you don't need the following two now, but put them also in your .zshrc
alias zcp='zmv -C'
alias zln='zmv -L'

그럼 당신은 실행할 수 있습니다zmv패턴에 따라 파일 이름을 바꿉니다. 이 두무늬zmv그리고 적절한 경우 텍스트를 확장하는 함수 에 그대로 전달할 수 있도록 대체 텍스트를 인용해야 합니다 .

zmv '^*.*' '$f.md'

두 매개변수 주위에 작은따옴표가 있다는 점에 유의하세요. 패턴과 대체 표현식은 문자 그대로 함수에 전달되어야 합니다 zmv.

^*.*일치하는 파일을 제외한 모든 파일을 나타냅니다 . 이는 (기존 패턴 구문의 zsh 확장자 모두) 단축어 *.*입니다 . *~*.*이 모드를 외부적으로 사용하려면 먼저 실행 zmv해야 합니다 setopt extended_glob(본인 모드에도 적용 .zshrc).

배쉬에서

Bash에는 편리한 도구가 없으므로 루프에 의존해야 합니다. 먼저, 시스템에 있어야 하는 ksh globbing 확장을 활성화하십시오 ~/.bashrc.

shopt -s extglob

!(PATTERN)이제 연산자를 사용하여 확장자가 없는 파일을 일치시킬 수 있습니다 .

for x in !(*.*); do
  mv -- "$x" "$x.md"
done

$x파일 이름에 공백이나 와일드카드가 포함된 경우 큰따옴표가 필요합니다. --파일 이름 이 -.

어떤 껍질에서든

연산자가 없으면 !(…)모든 파일을 반복하고 루프 내에서 각 파일 이름을 테스트할 수 있습니다.

for x in *; do
  case "$x" in
    *.*) ;;         # skip this file
    *) mv -- "$x" "$x.md";;
  esac
done

답변2

당신은 rename이것을 할 수 있습니다 (때때로 함께 제공되는 것)perl이름 바꾸기 prename). 디렉터리에 다른 파일이 있는 경우 다음과 같이 extglob을 사용하여 해당 파일을 제외해야 합니다.

shopt -s extglob
rename s/$/.md/ -- !(*.*)

답변3

짧은 답변을 찾았습니다.여기(이것은 이름 바꾸기도 지원하는데, 이는 제가 이 페이지를 찾았을 때 찾고 있던 것입니다.)

for f in *.OLDNAME; do mv $f `basename $f .OLDNAME`.NEWNAME; done;

물론 이는 확장을 추가하거나 제거하는 경우에도 적용됩니다.

# Adding extension
for f in *; do mv $f ${f}.NEWNAME; done; # No need to use basename here -- just adding a new extension

# Removing extension
for f in *.OLDNAME; do mv $f `basename $f .OLDNAME`; done;

답변4

더 쉬운 방법이 있을 수 있지만 이 방법은 매우 간단하며 일반적인 형식은 다양한 목적에 사용됩니다.

for name in *; do 
    if [ -f "$name" ]; then 
        mv -- "$name" "$name.md"
    fi
done

함수로 변환할 수도 있습니다.

관련 정보