Jak mogę zmienić nazwę wielu plików JPEGS, które są w wielu podfolderach sekwencyjnie?
.. W tej chwili wiele z nich ma tę samą nazwę pliku (np. Rame1.jpeg). Chcę tylko mieć 6-cyfrowy przyrostek numeryczny na wszystkich plikach JPG, które mają "ramkę" w nazwie pliku, ale w sekwencji, tak że później mogę przenieść je w jednym folderze bez niebezpieczeństwa, że są nadpisane.

Prawdopodobnie jest to sposób, aby zrobić to z znajdź , ale nie wiem, jak ...

To moja struktura folderów:

├── mainfolder
|    ├── subfolder1
|    |   ├── frame1.jpg
|    |   └── frame2.jpg
|    |   └── unimportant.jpg
|    |
|    ├── subfolder2
|    |   ├── frame1.jpg
|    |   └── frame2.jpg
|    |   └── unimportant.jpg
|    |
|    ├── subfolder3
|    |   ├── frame.jpg
|    |   └── frame2.jpg
|    |   └── unimportant.jpg
…


.. W ten sposób wyobrażam sobie, że pliki mają być nazwane na końcu:

..

├── mainfolder
|    ├── subfolder1
|    |   ├── frame0000001.jpg
|    |   └── frame0000002.jpg
|    |   └── unimportant.jpg
|    |
|    ├── subfolder2
|    |   ├── frame0000003.jpg
|    |   └── frame0000004.jpg
|    |   └── unimportant.jpg
|    |
|    ├── subfolder3
|    |   ├── frame0000005.jpg
|    |   └── frame0000006.jpg
|    |   └── unimportant.jpg
…
1
Philipp 21 luty 2019, 19:02

2 odpowiedzi

Najlepsza odpowiedź

Podobnie jak w przypadku wszystkich nowych, nieznanych poleceń, spróbuj tego na kopiowaniu swoich plików, po dokonaniu kopii zapasowej urządzenia. Nie próbuj tego, nie próbuj tego w katalogu domowym, ponieważ rejestruje się do podtańców, więc wypróbuj go w katalogu poniżej którego nie masz nic ważnego!

Myślę, że rozumiem! Jeśli używasz homebrew , możesz użyć:

brew install rename

Aby zainstalować polecenie Perl rename.

Następnie możesz to uruchomić:

find . -name "frame*.jpg" -print0 | rename --dry-run --stdin -0 -N "000001" '$_="frame" . $N . ".jpg"'

Który mówi ... "Znajdź wszystkie pliki JPEG w bieżącym katalogu i poniżej, które zaczynają od frame... i przekazać swoje nazwy do rename za pomocą zerowego zakończenia. rename Narzędzie Następnie odczytuje nazwy końcowe i uruchamiają licznik $N za pomocą 6 cyfr całkowity szerokość i ustawia nazwę pliku do słowa frame, a następnie numer sekwencyjny, zwiększający 1 dla każdego pliku i dołączania {{ X5}} przyrostek ".

Jeśli wyjście wygląda dobrze, uruchom ponownie bez --dry-run.

0
Mark Setchell 22 luty 2019, 13:12

To Kod CelCheck -Clean zostanie wydrukowany listę mv, które powinno być co chcesz:

#! /bin/bash

seqnum=1
find mainfolder -type f -name 'frame*.jpg' -print0 \
    |   while IFS= read -r -d '' jpg_path ; do
            dir=${jpg_path%/*}
            printf -v new_jpg_path '%s/frame%06d.jpg' "$dir" $((seqnum++))
            echo mv -i -- "$jpg_path" "$new_jpg_path"
        done

Jeden jesteś szczęśliwy, że zrobi właściwą rzecz, usuń echo przed mv ... i uruchom go, aby faktycznie wykonać zmienić nazwę. Opcja -i do mv jest ochrona przed nadpisywaniem plików, które mogłyby już istnieć.

1
pjh 21 luty 2019, 20:54