이름이 바뀌면 mv는 무엇을 하게 되나요? [복사]

이름이 바뀌면 mv는 무엇을 하게 되나요? [복사]

아래 답변에 따라 매우 구체적인 질문이 있습니다.Bash 스크립트를 사용하여 여러 파일 이름 바꾸기일부 파일의 이름을 바꾸려고 합니다. 이것은 내가 사용하는 코드입니다.

#!/bin/bash
for file in *.HHZ_00; do mv $file ${file/${file:14:2}/00}; done

나는 이것의 목적이 문자 인덱스 14(0부터 시작) 뒤에 오는 2개의 문자를 00으로 바꾸는 것임을 이해합니다.

2개의 파일 하위 집합으로 테스트 중인데 그 중 하나는 다음과 같습니다.

2018113154211.25.AGCC.HHZ_00
2018113154211.25.APAC.HHZ_00

코드를 실행하면 다음과 같이 이름이 성공적으로 변경되었습니다.

2018113154211.00.AGCC.HHZ_00
2018113154211.00.APAC.HHZ_00

두 번째 하위 집합은 실패합니다. 이 하위 집합은 다음과 같습니다.

2018070220829.28.AGCC.HHZ_00
2018070220829.29.APAC.HHZ_00

이름이 다음으로 변경되지 않았습니다.

2018070220829.00.AGCC.HHZ_00
2018070220800.29.APAC.HHZ_00

내가 원했던 인덱스 14와 15 대신 두 번째 파일의 인덱스 11과 12가 어떻게 변경되었는지 확인하세요. 이제 매우 이상하게도 마지막 파일을 입력으로 사용하여 두 번째로 실행하니 다음과 같은 결과를 얻습니다.

2018070220829.00.AGCC.HHZ_00
2018070220800.00.APAC.HHZ_00

이것은 부분적으로 성공했지만 이제 두 번째 파일 이름이 손상되었습니다. 내가 뭘 잘못하고 있는 걸까요? 이 파일에 29가 중복되어 있기 때문인가요?

이름 바꾸기 명령을 사용하는 솔루션이 있다면 사용해 보았지만 구문에 익숙하지 않습니다.

답변1

예, 역할이 중복되었기 때문입니다 ${file/${file:14:2}/00}.첫 번째위치 14-15에 나타나는 모든 문자의 인스턴스입니다.

중첩된 매개변수 확장 없이 bash에서 이를 수행하는 쉬운 방법은 다음과 같습니다.

$ for file in *.HHZ_00; do 
    echo mv "$file" "${file:0:14}00${file:16}"
  done
mv 2018070220829.28.AGCC.HHZ_00 2018070220829.00.AGCC.HHZ_00
mv 2018070220829.29.APAC.HHZ_00 2018070220829.00.APAC.HHZ_00
mv 2018113154211.25.AGCC.HHZ_00 2018113154211.00.AGCC.HHZ_00
mv 2018113154211.25.APAC.HHZ_00 2018113154211.00.APAC.HHZ_00

POSIXly에서는 %%#(두 번)을 사용하여 각각 가장 긴 접미사와 가장 짧은 접두사를 제거할 수 있습니다.

$ for file in *.HHZ_00; do 
    pfx="${file%%.*}"; rem="${file#*.}"; sfx="${rem#*.}" 
    echo mv "$file" "${pfx}.00.${sfx}"
  done
mv 2018070220829.28.AGCC.HHZ_00 2018070220829.00.AGCC.HHZ_00
mv 2018070220829.29.APAC.HHZ_00 2018070220829.00.APAC.HHZ_00
mv 2018113154211.25.AGCC.HHZ_00 2018113154211.00.AGCC.HHZ_00
mv 2018113154211.25.APAC.HHZ_00 2018113154211.00.APAC.HHZ_00

echo올바른 일을 하고 있다는 확신이 들면 제거하세요.

답변2

@steeldriver가 매우 잘 설명했고 다음을 사용하여 문제를 해결했습니다.

#!/bin/bash
for file in *.HHZ_00; do mv $file ${file/${file:13:4}/.00.}; done

관련 정보