Mam katalog zawierający pliki obrazów o nazwach takich jak
image1.jpg
image2.jpg
image3.jpg
...
Niestety, nazwy obrazów muszą być zerowe, więc image1.jpg
powinno być image0.jpg
, image2.jpg
powinno być image1.jpg
i tak dalej.
Mogę napisać skrypt, aby wygenerować takie polecenia mv, umieścić je w skrypcie powłoki, a następnie wykonać je -
mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...
Ale przypuszczam, że jest lepszy sposób na uniks. Więc co to jest?
command-line
rename
Wes
źródło
źródło
for i in $(seq 0 100); do mv image$[i+1].jpg image$i.jpg; done
)imageN.jpg
naimage0.jpg
i gotowe.Odpowiedzi:
Nazwa starego dobrego Perla:
[Uwagi]
Numery zdjęć powinny być większe niż 0.
Jeśli obrazy są większe niż 9 i nie mają zera, użyj,
$(ls -v1 *)
aby uniknąć zatkania. Zaproponowane przez @arielf i zauważone przez @Graeme.W razie wątpliwości używaj również
-v
do pełnego mówienia i-n
do braku działania.źródło
perlreref
0
w źródłach.*
na końcu na,`ls -v1 *`
a będziesz bezpieczniejszy od zatykania. Przejdzie od najniższej liczby do najwyższej.Wygenerowane
mv
polecenia można przesyłać strumieniowo dobash
. Więc nie musisz kopiować ich w skrypcie i wykonywać tego. Widzieć:I wszystko zostanie wykonane, co jest przesyłane potokowo
bash
.źródło
:)
Rozwiązuje problem, więc +1.Możesz iterować na wyjściu ls, ten działa na twoim przykładzie:
Musisz być na tej samej ścieżce swoich plików
źródło
-i
lub-n
zmv
, zapobiegnie nadpisywaniu w przypadkach krawędzi.sort -V
byłoby lepiej zamiast tego?sort
nie będzie działać, to pokażeimage10.jpg
przedimage1.jpg
co może być problemem. Potrzebujeszsort -nk 1.8
jak w odpowiedzi @ Graeme.sort -V
to dobry pomysł, doda go do mojej odpowiedzi. Mogą być jednak inne przypadki krawędzi, po prostu dobra rada, aby dodać tego rodzaju opcje z pytaniami takimi jak ten, na wypadek, gdyby ktoś skopiował i wyrządził jakieś szkody.Poniższe wydaje się działać dla wszystkiego, co pasuje do wzorca
imageNUMBER.jpg
. Umieściłemecho
przedmv
poleceniem, aby najpierw pokazać, co zrobi polecenie; aby faktycznie zmienić nazwę, po prostu usuńecho
W pierwszym wierszu
ls image*.jpg|sort -V
spowoduje wyświetlenie plików JPG z rosnącymi liczbami w nazwie pliku.x=
Linia wyodrębnia numer z pliku.y=
Linia następnie zmniejsza liczbę o jeden. Wejściowa nazwa pliku iy
numer są następnie używane wmv
poleceniu, gdzie-i
flaga powiadomi Cię przed zastąpieniem pliku.W przypadku mojego małego testu uzyskano wynik:
Osobiście sugeruję zmianę nazwy na inną nazwę pliku, ponieważ teraz kolejność przetwarzania plików może mieć duże znaczenie.
źródło
-i
lub-n
zmv
, zapobiegnie nadpisywaniu w przypadkach krawędzi.sort -n
,-V
opcja nie istnieje.Korzystanie ze
perl
skryptuprename
, który jest dowiązany symbolicznie do zmiany nazwy w dystrybucjach opartych na Debianie, również wymaga GNUfind
/sort
. Pliki są ułożone w porządku rosnącym, aby zapobiec nadpisaniu.Usuń,
-n
gdy masz pewność, że robi to, co chcesz. Ostrzeże o plikach już istniejących przed zrobieniem tego. Jednak tak długo, jak pokazuje, że nazwy plików są zmieniane w kolejności rosnącej, nie będzie żadnych konfliktów, gdy zostanie uruchomiony w trybie rzeczywistym.źródło
Z
zsh
:(usuń,
-n
gdy będzie szczęśliwy).(n)
polega na posortowaniu listy numerycznie, dlategoimage9.jpg
wcześniej zmienia się jej nazwęimage10.jpg
.źródło