Jak wsadowo zmieniać nazwy plików (obrazów) na podstawie pliku CSV

11

Co mam i chcę osiągnąć:

  1. W jednym folderze znajdują się tysiące zdjęć.

  2. Mam plik CSV z następującymi kolumnami:

    Odp .: oryginalna nazwa B: zmieniona nazwa

    Typowy wiersz wygląda następująco:

    "original-1.jpg","renamed-1.jpg"  
    "original-2.jpg","renamed-2.jpg"
    

    Mogę usunąć cytaty, to nie problem.

  3. Teraz chcę użyć aplikacji lub uruchomić skrypt, który wyszuka wszystkie obrazy w kolumnie A i zmieni ich nazwy na nazwy w kolumnie B (np. Original-1.jpg -> renamed-1.jpg).

Istnieje kilka odpowiedzi, na przykład:

http://ubuntuforums.org/showthread.php?t=1069652

http://systembash.com/content/one-line-batch-rename-files-using-csv-input-file-and-awk/

W grę wchodzą jednak pewne skrypty i nie jestem pewien, czy wszystkie te skrypty wpływają tylko na folder, w którym przechowujesz skrypt, czy mogą zmienić nazwy wszystkich plików na dysku, które spełniają określone warunki. Oczywiście tego drugiego należy unikać.

To, czego szukam, to prosty przewodnik, jak zmienić nazwę plików i jak wybrać folder z plikami.

Z góry dziękuję.

weź 2
źródło

Odpowiedzi:

13

To powinno Ci pomóc:

sed 's/"//g' files.csv | while IFS=, read orig new; do mv "$orig" "$new"; done 

Wyjaśnienie:

  • sed 's/"//g' files.csv : usuń cytaty
  • IFS=, : podziel wejście na ,
  • while read orig new; do ... done: Odczyta każdy wiersz wejściowy, podzieli go na wartość $IFS(tutaj przecinek) i zapisze 1. pole jako, $origa resztę jako $new.
  • mv "$orig" "$new" : zmieni to nazwę plików zgodnie z żądaniem.

Jeśli plik zawiera tylko nazwy plików (jak orig.jpg) i nie ma ścieżek (nie /home/take2/orig.jpglub podobnych), powyższe polecenie wpłynie tylko na pliki w bieżącym katalogu. Musisz więc otworzyć terminal cddo katalogu docelowego i tam go uruchomić.

Najpierw przetestuj:

Aby to przetestować, możesz najpierw wykonać próbę suchą, drukując polecenia, które zostaną uruchomione bez ich wykonania:

sed 's/"//g' files.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done 
terdon
źródło
Świetnie, to wyjaśniono lepiej. :) Wystarczy sprawdzić przed uruchomieniem - muszę cd do katalogu docelowego i uruchomić tę linię, czy muszę zapisać tę linię jako example.sh, a następnie uruchomić „example.sh” z terminala?
weź 2
@ take2 możesz po prostu uruchomić linię bezpośrednio. Zaktualizowałem odpowiedź, aby zobaczyć, co zostanie uruchomione bez faktycznej zmiany plików. Zalecam, abyś zrobił to najpierw.
terdon
Cudownie, działa! Jeszcze jedno - czy to obchodzi, jakie są etykiety kolumn (w tej chwili są to „orig” i „nowe”), czy po prostu zmienia nazwy kolumn A na nazwy kolumn B?
weź 2
@ take2 jakie etykiety? Nie, zajmuje tylko pierwsze pole oddzielone przecinkami i zmienia nazwę na drugie. Zauważ, że jeśli są więcej niż dwa pola, zmieni nazwę na resztę wiersza. Tak długo, jak plik wejściowy jest taki jak opublikowany, będzie działał zgodnie z oczekiwaniami.
terdon
Btw. Terminal wyświetla również „mv: nie można stat 'orig”: nie ma takiego pliku lub katalogu ”, chociaż zmienił nazwę pliku.
weź 2