세 가지 대안을 제안하겠습니다. 각각은 간단한 한 줄 명령이지만, 처리 할 파일이 동일한 직접 경로의 다른 파일과 혼합되는 경우를 대비하여보다 복잡한 경우에 대한 변형을 제공합니다.
mmv
동일한 이름
의 패키지 에서 mmv 명령 을 사용합니다 .
mmv '*HBO_DPM*' '#1dpm#2'
인수는 문자열로 전달되므로 셸에서 glob 확장이 발생하지 않습니다. 이 명령은 정확히 두 개의 인수를받은 다음 파일 수에 대한 제한없이 내부에서 해당 파일을 찾습니다. 또한 위의 명령은 첫 번째 glob과 일치하는 모든 파일의 이름이 바뀌어야한다고 가정합니다. 물론보다 구체적으로 설명 할 수 있습니다.
mmv 'sb_606_HBO_DPM_*' 'sb_606_dpm_#1'
동일한 디렉토리에 요청 된 번호 범위를 벗어난 파일이있는 경우이 답변에서 더 아래에 주어진 루프 오버 번호를 사용하는 것이 좋습니다. 그러나 적절한 패턴으로 일련의 mmv 호출을 사용할 수도 있습니다.
mmv 'sb_606_HBO_DPM_0089*' 'sb_606_dpm_0089#1' # 0089000-0089999
mmv 'sb_606_HBO_DPM_009*' 'sb_606_dpm_009#1' # 0090000-0099999
mmv 'sb_606_HBO_DPM_01[0-5]*' 'sb_606_dpm_01#1#2' # 0100000-0159999
mmv 'sb_606_HBO_DPM_016[0-2]*' 'sb_606_dpm_016#1#2' # 0160000-0162999
mmv 'sb_606_HBO_DPM_01630[01]?' 'sb_606_dpm_01630#1#2' # 0163000-0163019
mmv 'sb_606_HBO_DPM_016302[0-2]' 'sb_606_dpm_016302#1' # 0163020-0163022
숫자를 반복하다
설치를 피하거나이 범위 밖의 일치를 피하면서 숫자 범위로 선택해야하고 74,023 명령 호출을 기다릴 준비가 되었다면 일반 bash 루프를 사용할 수 있습니다.
for i in {0089000..0163022}; do mv sb_606_HBO_DPM_$i sb_606_dpm_$i; done
시퀀스에 간격이 없기 때문에 이것은 특히 잘 작동합니다. 그렇지 않으면 소스 파일이 실제로 존재하는지 확인할 수 있습니다.
for i in {0089000..0163022}; do
test -e sb_606_HBO_DPM_$i && mv sb_606_HBO_DPM_$i sb_606_dpm_$i
done
for ((i=89000; i<=163022; ++i))
괄호 확장 과 달리 몇 년 전에 일부 Bash 릴리스 이후 선행 0을 처리합니다. 실제로 변경을 요청 했으므로 유스 케이스를 보게되어 기쁩니다.
추가 자료 : Bash 정보 페이지의 브레이스 확장 , 특히 관련 부분 {x..y[..incr]}
.
파일을 반복
또 다른 옵션은 해당 정수 범위를 반복하는 대신 적절한 glob를 반복하는 것입니다. 이 같은:
for i in *HBO_DPM*; do mv "$i" "${i/HBO_DPM/dpm}"; done
이 역시 mv
파일 당 한 번의 호출입니다. 그리고 루프는 요소의 긴 목록에 있지만 전체 목록은 하위 프로세스에 인수로 전달되지 않지만 bash에 의해 내부적으로 처리되므로 제한이 문제를 일으키지 않습니다.
추가 정보 : Bash 정보 페이지의 쉘 매개 변수 확장${parameter/pattern/string}
.
숫자 범위를 제공 한 숫자 범위로 제한하려면 해당 검사를 추가 할 수 있습니다.
for i in sb_606_HBO_DPM_+([0-9]); do
if [[ "${i##*_*(0)}" -ge 89000 ]] && [[ "${i##*_*(0)}" -le 163022 ]]; then
mv "$i" "${i/HBO_DPM/dpm}"
fi
done
여기에 ${i##pattern}
가장 긴 접두사 일치 제거 pattern
에서를 $i
. 가장 긴 접두사는 무엇이든, 밑줄, 0 또는 그 이상의 0으로 정의됩니다. 후자는 설정 되는 옵션 에 따라 *(0)
확장 된 glob 패턴 으로 작성됩니다 . 앞의 0을 제거하는 것은 숫자를 밑이 8이 아닌 밑이 10으로 취급하는 데 중요합니다. in 루프 인수는 파일이 동일하게 시작하지만 끝나지 않는 파일이있는 경우를 대비하여 하나 이상의 숫자와 일치하는 또 다른 확장 된 glob입니다. 번호.extglob
+([0-9])
ARG_MAX
제한 과 충돌하기 때문에 작동하지 않습니다 . 이 질문은 명령 행 솔루션을 명시 적으로 요청하므로 다른 질문과 마찬가지로 GUI 솔루션도 일치하지 않을 수 있습니다.