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