긴 파일 이름의 확장자를 빠르게 변경하는 방법은 무엇입니까?

긴 파일 이름의 확장자를 빠르게 변경하는 방법은 무엇입니까?

원본 파일: a really really long name with spaces.ext
대상 파일:the same name.new-ext

주문하다:mv *part of the name that'll give a unique answer.ext $(echo $(ls -l | grep -i *.ext | cut -d ' ' -f 11-))

결과:mv: target 'last word of the name.ext': No such file or directory

내가 뭘 잘못했나요?

추신: 원격 시스템에서는 이것만 허용하므로 sh(bash도 허용하지 않음) 탭 완성이 불가능합니다.

답변1

다음을 수행할 수 있습니다.

for f in *long*.ext; do mv -- "$f" "${f%.ext}.new-ext"; done

또는 dash 및 busybox ash(hush 아님)를 포함한 여러 셸에서 $_이전 명령의 마지막 인수로 확장됩니다.

echo *long*

올바른 파일이 표시되는지 확인한 후 다음을 수행하십시오.

mv -- "$_" "${_%.ext}.new-ext"

답변2

출력에서 파일 이름 앞의 공백 수는 ls -l매우 다양하며 일반적으로 10이 아닙니다. 문자 수도 다양하므로 cut -c안전하지도 않습니다.

ls하지만 그럴 필요는 없습니다( grep -iExT가 필요하므로 그렇게 하고 싶지도 않습니다). $(echo *blah.ext |sed s/ext$/new-ext$/)괜찮습니다.

(수정됨) bash/ksh/zsh에서 더 나은 방법 f=(*ext); mv -- "$f" "${f%.ext}.new-ext"을 고려 하겠습니다 ${#f[@]} -gt 1. POSIX(예: dash, ash, busybox)에 붙어 있으면 set -- *blah.ext; if [ "$#" -eq 1 ]; then mv -- "$1" "${1%.ext}.new-ext"; else echo>&2 "error: $# files match"; fi.

답변3

가장 쉬운 방법은 다음 rename명령을 사용하는 것입니다.

rename '.old' '.new' *'long'*'.old'

문자열에는 공백이 포함될 수 있으므로 따옴표를 사용합니다.

관련 정보