원본 파일: 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 -i
ExT가 필요하므로 그렇게 하고 싶지도 않습니다). $(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'
문자열에는 공백이 포함될 수 있으므로 따옴표를 사용합니다.