현재 디렉터리에 확장자가 없는 파일이 일부 있습니다(파일 이름에 점이 없음).
다음과 같이 이름을 바꾸고 싶습니다.
filename -> filename.md
나는 이것을 시도했지만 mv * *.md
도움이되지 않았습니다.
확장명에 대한 인수를 가져와 그에 따라 이름을 바꾸는 함수와 파일에 대한 작업을 수행하는 또 다른 함수에 관심이 있습니다.
답변1
패턴은 명령이 아닌 셸에 의해 일치되므로 시도하는 작업이 작동할 가능성이 없습니다.첫 번째쉘은 모든 파일(확장자가 없는 파일뿐만 아니라 이름에 a가 없는 파일 *
에 대해서는 아무 말도 하지 않았습니다 ) 및 이름이 ; 인 모든 파일로 확장됩니다. 그런 다음 쉘은 두 목록의 연결을 명령에 전달합니다..
*.md
.md
mv
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
함수로 변환할 수도 있습니다.