Mam zamiar zasugerować trzy alternatywy. Każde z nich jest prostym poleceniem w jednym wierszu, ale podam warianty dla bardziej skomplikowanych przypadków, głównie na wypadek, gdyby pliki do przetworzenia zostały zmieszane z innymi plikami w tym samym katalogu.
mmv
Chciałbym użyć polecenia MMV
z pakietu o tej samej nazwie :
mmv '*HBO_DPM*' '#1dpm#2'
Zauważ, że argumenty są przekazywane jako ciągi, więc ekspansja globu nie zachodzi w powłoce. Polecenie otrzymuje dokładnie dwa argumenty, a następnie wyszukuje odpowiednie pliki wewnętrznie, bez ścisłych ograniczeń liczby plików. Zauważ też, że powyższe polecenie zakłada, że wszystkie pliki pasujące do pierwszego globu zostaną przemianowane. Oczywiście możesz być bardziej szczegółowy:
mmv 'sb_606_HBO_DPM_*' 'sb_606_dpm_#1'
Jeśli pliki znajdują się poza żądanym zakresem numerów w tym samym katalogu, lepiej byłoby, gdyby pętla nad liczbami była podana w dalszej części tej odpowiedzi. Można jednak użyć sekwencji wywołań mmv z odpowiednimi wzorami:
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
zapętlić liczby
Jeśli chcesz uniknąć instalowania czegokolwiek lub musisz wybrać według zakresu numerów, unikając dopasowań poza tym zakresem, i jesteś gotowy czekać na 74.023 wywołania komend, możesz użyć zwykłej pętli bash:
for i in {0089000..0163022}; do mv sb_606_HBO_DPM_$i sb_606_dpm_$i; done
Działa to szczególnie dobrze, ponieważ nie ma żadnych przerw w sekwencji. W przeciwnym razie możesz sprawdzić, czy plik źródłowy faktycznie istnieje.
for i in {0089000..0163022}; do
test -e sb_606_HBO_DPM_$i && mv sb_606_HBO_DPM_$i sb_606_dpm_$i
done
Zauważ, że w przeciwieństwie do for ((i=89000; i<=163022; ++i))
rozszerzenia nawiasów obsługuje zer wiodących, ponieważ kilka wersji Bash kilka lat temu. Właściwie o zmianę, o którą prosiłem, więc cieszę się, że widzę przypadki jej użycia.
Dalsza lektura: Brace Expansion na stronach informacyjnych Bash, szczególnie w części o {x..y[..incr]}
.
przeglądaj pliki
Inną opcją byłoby zapętlenie odpowiedniego globu zamiast zapętlenia danego zakresu liczb całkowitych. Coś takiego:
for i in *HBO_DPM*; do mv "$i" "${i/HBO_DPM/dpm}"; done
Ponownie jest to jedno mv
wywołanie na plik. I znowu pętla ma długą listę elementów, ale cała lista nie jest przekazywana jako argument do podprocesu, ale obsługiwana wewnętrznie przez bash, więc limit nie spowoduje problemów.
Dalsza lektura: Rozszerzanie parametrów powłoki na stronach informacyjnych Bash, dokumentowanie ${parameter/pattern/string}
między innymi.
Jeśli chcesz ograniczyć zakres numerów do tego, który podałeś, możesz dodać opcję:
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
Tutaj ${i##pattern}
usuwa najdłuższe dopasowanie prefiksu pattern
z $i
. Ten najdłuższy prefiks jest zdefiniowany jako dowolny, następnie znak podkreślenia, a następnie zero lub więcej zer. Ten ostatni jest zapisywany jako taki, *(0)
który jest rozszerzonym wzorcem globu, który zależy od ustawionej extglob
opcji . Usuwanie zer wiodących jest ważne, aby traktować liczbę jako bazę 10, a nie 8. Argument +([0-9])
w pętli to kolejny rozszerzony glob, dopasowujący jedną lub więcej cyfr, na wypadek, gdyby pliki tam, które zaczynają się tak samo, ale nie kończą się na numer.
ARG_MAX
limitem powłoki . Ponieważ pytanie to wyraźnie wymaga rozwiązania z wiersza poleceń, (prawdopodobnie równe) rozwiązania GUI, tak jak w drugim pytaniu, również się nie zgadzają.