정규식(셸 스크립트)을 사용하여 여러 파일 복사/이름 바꾸기

정규식(셸 스크립트)을 사용하여 여러 파일 복사/이름 바꾸기

"Assignment02.cc", "Assignment02.h", "Assignment02.txt" 등과 같은 패턴과 일치하는 파일 모음이 있습니다. 이 파일을 "Assignment03.cc", "Assignment03.txt"로 복사/이름 변경하고 싶습니다. h', '할당03.txt' 등

쉘 스크립트와 sed를 사용하는 것이 간단해야 한다고 생각합니다. 지금까지 나는 다음을 가지고 있습니다 :

OLD_NO=$1
NEW_NO=$2

echo "Moving from $OLD_NO to $NEW_NO"

for name in assignment$OLD_NO.* ; do
  newname=$(echo $name | sed 's/\(.*\)$OLD_NO\(.*\)/\1xx$NEW_NO\2/')
  echo "$name -> $newname"
  # mv -v $name $newname
done

불행하게도 내가 sed를 호출하는 방식은 항상 입력 문자열을 반환 $name하고 실제로 정규식 찾기/바꾸기를 수행하지 않습니다.

참고: 이 작업을 수행하는 명령을 인터넷에서 찾았 rename지만 내 MacBook에서는 작동하지 않습니다.

답변1

여기서 sed를 사용하면 가치보다 더 복잡해집니다. 쉘에 내장된 텍스트 조작 기능을 사용하십시오. 예를 들어 ${name#assignment02}접두사를 제거하십시오.assignment02$name

for name in assignment02.*; do
  mv "$name" "assignment03${name#assignment02}"
done

파일 이름에 쉘 특수 문자가 포함되어 있지 않다면 큰따옴표가 필요하지 않습니다.

zsh를 사용할 수 있는 경우 해당 zmv기능은 이름 변경에 도움이 됩니다.

autoload zmv
zmv '(assignment)02.(*)' '${1}03.$2'

답변2

넌 이미 너무 복잡하게 생각했어

rename 02 03 *02*

'rename'은 arg3 또는 (*02*) 이후에 제공된 모든 파일 이름에서 첫 번째 인수('02')를 두 번째 인수('03')로 바꿉니다.

답변3

다른 접근 방식:

for ext in {cc,h,txt}
do 
  echo mv assignment02.$ext assignment03.$ext
done

장기적: "이름 바꾸기"를 시도해보세요

답변4

이를 수행할 수 있는 한 가지 방법은 다음과 같습니다.

ls -1  | sed "s/\(.*\)\..*$/mv '&' '\1.txt'/" | sh

관련 정보