여러 파일의 이름을 바꾸세요.

여러 파일의 이름을 바꾸세요.

파일 이름 끝 부분을 제외하고 동일한 이름을 가진 여러 파일의 이름을 바꾸고 싶습니다. 증분 카운터로 다른 부품을 교체하고 싶습니다. 예를 들어 다음 파일을 사용합니다.

71116_123    71116_134    71116_113    71116_023
71116_923    71116_103    71116_125    71116_223

이름을 다음으로 바꾸고 싶습니다.

71116_1    71116_2    71116_3    71116_4
71116_5    71116_6    71116_7    71116_8

비슷한 질문을 찾았습니다여기, 그러나 주어진 솔루션은 약간 복잡해 보입니다! 더 쉬운 해결책이 있나요?

답변1

따라서 귀하가 제공한 정보가 제한되어 있으므로 가정을 명시하고 실수가 있으면 알려주십시오. 답변을 조정할 수 있습니다. 이러한 가정은 논리를 단순하고 명확하게 유지하는 데 중요합니다. 그렇지 않으면 "과잉" 모드에 빠지게 됩니다.

가정 1. 파일의 "접미사"는 변경하려는 항목이고, "접미사"는 밑줄 뒤의 숫자입니다. 이는 밑줄("_")이 구분 기호임을 의미합니다.

가정 2. 원본 파일 이름에는 밑줄이 하나만 있습니다. 밑줄이 두 개 이상 없으며 밑줄도 절대 없습니다.

가정 3. "접두사"(즉, 구분 기호 앞의 값(가정 1에 정의됨))가 정확히 동일하게 유지되기를 원합니다.

가정 4. 원래 접미사와 상관없이 새 접미사가 동일한 구분 기호(가정 1에 정의된 대로)를 사용하고, 새 접미사의 이름이 타임스탬프나 이전 정렬 순서 이외의 다른 값에 의해 점진적으로 바뀌지 않기를 원합니다. 파일 이름의 원래 영숫자 정렬 순서).

가정 5. 당신은 그것이 불행히도 완전히 임의적인 매우 "단순"하기를 원하지만 나는 그것을 "복잡한 for 루프나 while 루프가 없고" "이상한 sed 또는 awk 명령이 너무 많지 않은" 것으로 정의할 것입니다.

따라서 어려운 문제는 아니지만 나열된 제약 조건을 고려하면 흥미로운 도전이 됩니다. 어쨌든, 나는 여전히 "간단한" for 루프와 "간단한" awk를 사용했습니다.

cnt=0
for i in *; do
  let cnt=cnt+1
  mv "$i" "$(echo "${i}_${cnt}" | awk -F_ '{print $1"_"$3}')"
done

동일한 디렉터리에 이름을 바꾸고 싶지 않은 다른 파일이 있는 경우 초기 테스트의 경우처럼( /tmp해당 디렉터리에서 테스트 중이었고 그 안에 이름을 바꾸고 싶지 않은 다른 파일이 있었습니다) 그런 다음 다음 부분을 사용하여 다음과 같이 접두사를 필터링합니다.

cnt=0
for i in 71116*; do
  let cnt=cnt+1
  mv "$i" "$(echo "${i}_${cnt}" | awk -F_ '{print $1"_"$3}')"
done

나는 귀하의 링크에서 답변을 보았습니다. Stackexchange의 많은 답변처럼 과잉이라는 데 동의합니다. 그러나 대부분의 "과도한" 답변은 더 적은 가정에 의존하므로 이론상으로는 제가 여기서 제공하는 것보다 더 "일반적" 및/또는 "이식성"이 있습니다.

관련 정보