Fórum Root.cz
Hlavní témata => Software => Téma založeno: xunil 17. 03. 2018, 10:40:47
-
Hledám jak hromadně přejmenovat fotky. Dejme tomu, že mám soubory ve tvaru 1000.jpg, 1001.jpg, 1002.jpg.
Pak mám tabulku:sem to nepřejmenovával ručně
1000 ABC07
1001 CDA04
1002 ABC03
ký nás
a potřebuji soubory přejmenovat dle tabulky výše, tak aby jsem nepřejmenoval ručně.
Je na to nějaký nástroj?
-
Python, Bash, Powershell.
Python bude najjednoduchší, ak ten súbor s tabuľkou prevedieš do csv.
Kód bude vyzerať potom asi takto (písané z hlavy):
import csv
import os
with open("tabulka.csv", newline="") as f:
reader = csv.reader(f)
for row in reader:
os.rename(row[0], row[1])
Treba si dať ale pozor na to v akom formáte je csv súbor a potom upraviť volanie csv.reader podľa dokumentácie: https://docs.python.org/3/library/csv.html#csv.reader
-
Bash. Spoléhá to na spoustu věcí - že v názvu souboru nejsou mezery je určitě ta první věc. Je to narychlo zprasený (určitě je tam něco, co bych dělat neměl), ale na vzorku tabulky to funguje.
cat tabulka | while read line; do from=$(echo $line | cut -d" " -f1); to=$(echo $line | cut -d" " -f2); mv $from.jpg $to.jpg; done
-
Hledám jak hromadně přejmenovat fotky. Dejme tomu, že mám soubory ve tvaru 1000.jpg, 1001.jpg, 1002.jpg.
Pak mám tabulku:sem to nepřejmenovával ručně
1000 ABC07
1001 CDA04
1002 ABC03
ký nás
a potřebuji soubory přejmenovat dle tabulky výše, tak aby jsem nepřejmenoval ručně.
Je na to nějaký nástroj?
Pokud je to jednorázová akce, tak bych na to ani nepsal skript – použil bych regulární výrazy v textovém editoru – třeba v Kate – a funkci Najít a nahradit.
Najít: ([^ ]+) (.*)
Nahradit: mv "\1" "\2";
(místo \1 a \2 bývá v jiných editorech $1 a $2 – jsou to odkazy na skupiny v závorkách z regulárního výrazu)
A z toho tvého vstupního souboru ti to vyrobí:
mv "1000" " ABC07";
mv "1001" " CDA04";
mv "1002" " ABC03";
Výsledek si zkontroluješ, případně ještě něco ručně upravíš. A pak už jen vložíš přes schránku to terminálu nebo uložíš jako skript a spustíš.
Nebo pak jsou přímo nástroje na hromadné přejmenování jako KRename. A v tomhle případě by se ti asi víc hodil příkaz vidir z balíčku moreutils. Ten ti otevře seznam souborů (zadaných buď parametrem nebo ze standardního vstupu) v editoru (nemusí to být vim), ty si je v tom editoru přejmenuješ (řádky jsou očíslované, to musíš zachovat) a po uložení a ukončení editoru ti to soubory přejmenuje.
-
P.S. pokud máš jako oddělovač víc mezer, tak za tou mezerou v regulárním výrazu mělo být +, aby se nezahrnula to cílového názvu. Tzn. najít: ([^ ]+) +(.*)
-
while read from to; do
mv "$from.jpg" "$to.jpg"
done <tabulka.txt
-
Díky za rady. Něco vyzkouším. Nejde o jednorázovou akci. CSV není problém (zatím tabulka v Calc). V názvu nejsou mezery. Ještě jednou díky za nasměrování.
-
jak už tu někdo psal, nejlepší je tu tabulku upravit v editoru na script a ten spustit.
kdybys to potřeboval udělat neinteraktivně, tak nějak tak.
cat table.txt | awk '{print "mv "$1".jpg "$2".jpg"}' | bash
-
while read from to; do
mv "$from.jpg" "$to.jpg"
done <tabulka.txt
Je to elegantnější, pravda, moje špagety budou odteď zase lepší (ale stejně si myslím že i když je cat pomalejší, je to drobet přehlednější :) - a v jednom spuštění to stejnak nevadí...)