파일 이름의 패턴 교체

파일 이름의 패턴 교체

발견된 모든 솔루션이 제 경우에 적합하지 않기 때문에 질문을 다시 작성해야 합니다. 많은 패딩을 처리할 때 파일 이름에 여러 대체를 허용하는 한 줄 유틸리티를 사용하고 싶습니다. 입력 파일 이름의 형식입니다.

1300_grid12_04_lig_cne_767_lig.dlg

예상되는 결과는 다음과 같습니다.

130004_lig_cne_767.dlg

그래서 각 파일에 대해 두 개의 패턴을 바꿔야 합니다."그리드 12"에서 "_"로 및 "_lig."에서 "." 전체 패딩에 대해 수동으로 두 개의 후속 루프를 사용하여 이를 달성할 수 있는데, 이는 많은 양의 패딩을 처리하는 데 매우 느린 방법입니다.

# 1st loop over the files and substitute patter _grid12_ to _.
for file in ./*.dlg; do mv -v "$file" "${file/_grid12_/_}"; done
# 2nd loop these filles to substitute _lig. to .
for file in ./*.dlg; do mv -v "$file" "${file/_lig./.}"; done

rename 명령을 시도했지만 패턴을 올바르게 인식하지 못합니다.

rename 's/_grid12_/_/g' *.dlg

이 작업을 빠르게 수행하기 위해 루프 패딩을 피하는 것이 가능합니까?

답변1

이렇게 하면 각 파일의 이름을 최종 이름으로 직접 바꾸는 것보다 루프 속도가 두 배 빨라집니다.

for file in ./*.dlg; do
    new=${file/_grid12_/_}
    mv -v "$file" "${new/_lig./.}"
done

이름 바꾸기를 병렬로 실행하면 속도를 어느 정도 높일 수 있습니다(그러나 IO는 쉽게 병목 현상을 일으킬 수 있습니다).

cpu_tally=$(grep -c ^processor /proc/cpuinfo)
for file in ./*.dlg; do
    new=${file/_grid12_/_}
    printf '%s\0' "$file" "${new/_lig./.}"
done  | xargs -r0 -n2 -P$cpu_tally -exec mv -v

답변2

느린 점은 mv각 파일에 대해 별도의 유틸리티를 실행하는 것입니다. zsh유틸리티를 내장할 수 있는 위치 로 전환할 수 있습니다 .mv

zmodload zsh/files # makes mv and a few other file manipulation utilities builtin
autoload -Uz zmv   # batch renaming tool
zmv -v '*.dlg' '${${f/_grid12_/_}/_lig./.}'

zmv단순 루프에 비해 추가 기능이 있습니다. 예를 들어 충돌이 발견되면 이름 바꾸기를 시작하기 전에 중단됩니다.

간단한 루프는 다음과 같습니다.

for f (*.dlg(#qoN)) mv -vi -- ${${f/_grid12_/_}/_lig./.}

정렬을 비활성화하기 위해 여기에 glob 한정자가 추가되었습니다 (#qoN).

답변3

touch 1300_grid12_04_lig_cne_767_lig.dlg
# if you have few
parallel mv {} '{= s/_grid12_04//; s/_lig.dlg/.dlg/ =}' ::: *.dlg
# if you have thousands
printf "%s\0" *.dlg |
  parallel -0 mv {} '{= s/_grid12_04//; s/_lig.dlg/.dlg/ =}'
ls 1300*dlg

관련 정보