Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Honza1Ubuntu 16. 09. 2018, 08:44:19

Název: Rekurzivní přejmenování souboru dle určitého znaku
Přispěvatel: Honza1Ubuntu 16. 09. 2018, 08:44:19
Ahoj

Zkousim prejmenovat rekurzivne soubory a slozky, ktere misty obsahuji v nazvech urcity "nepekny" znak a chtel bych tento znak prepsat na _

Jedna se o sadu znaku: - : `)('&%:" predelat na podtrzitko _
Ze dvou podtrzitek pak zkousim udelat jedno.

Zkousel jsem napr. Rename, ale nefunguje to:

Kód: [Vybrat]
rename 's/-/_/g' *
rename 's/:/_/g' *
rename 's/(/_/g' *
rename 's/)/_/g' *
rename 's/%/_/g' *
rename 's/\&/_/g' *
rename 's/\`/_/g' *
rename 's/\"/_/g' *
rename 's/\'/_/g' *
rename 's/__/_/g' *
rename 's/__/_/g' *
rename 's/__/_/g' *
rename 's/__/_/g' *
rename 's/__/_/g' *

Nemel by s tim nekdo zkusenosti ?
Název: Re:Rekurzivni prejmenovani souboru dle urciteho znaku
Přispěvatel: mhepp 16. 09. 2018, 09:20:04
Zkus find na vylistovani tech vadnych souboru, pak pipe do while read jmeno; do ... A zde rozdelit na cestu a jmeno souboru (basename) a tr na nahradu znaku a mv na prejmenovani.
Název: Re:Rekurzivni prejmenovani souboru dle urciteho znaku
Přispěvatel: dustin 16. 09. 2018, 10:10:24
Zkusil jsi rovnou detox, co s tím udělá?
Název: Re:Rekurzivni prejmenovani souboru dle urciteho znaku
Přispěvatel: Honza1Ubuntu 16. 09. 2018, 11:20:12
Zkus find na vylistovani tech vadnych souboru, pak pipe do while read jmeno; do ... A zde rozdelit na cestu a jmeno souboru (basename) a tr na nahradu znaku a mv na prejmenovani.

Diky, podle tohoto navodu to vypada, ze funguje. Jen to nehraje pro super-uvozovku ` , to je holt moc silny znak.

Kód: [Vybrat]
for X in `find -name *\-*` ; do Y=`echo ${X} | tr -s "\-" "_"` ; mv ${X} ${Y} ; done
for X in `find -name *\%*` ; do Y=`echo ${X} | tr -s "\%" "_"` ; mv ${X} ${Y} ; done
for X in `find -name *\'*` ; do Y=`echo ${X} | tr -s "\'" "_"` ; mv ${X} ${Y} ; done
for X in `find -name *\"*` ; do Y=`echo ${X} | tr -s "\"" "_"` ; mv ${X} ${Y} ; done
for X in `find -name *\&*` ; do Y=`echo ${X} | tr -s "\&" "_"` ; mv ${X} ${Y} ; done
for X in `find -name *\:*` ; do Y=`echo ${X} | tr -s "\:" "_"` ; mv ${X} ${Y} ; done
for X in `find -name *\.*` ; do Y=`echo ${X} | tr -s "\." "_"` ; mv ${X} ${Y} ; done
for X in `find -name *\+*` ; do Y=`echo ${X} | tr -s "\+" "_"` ; mv ${X} ${Y} ; done
for X in `find -name *\(*` ; do Y=`echo ${X} | tr -s "\(" "_"` ; mv ${X} ${Y} ; done
for X in `find -name *\)*` ; do Y=`echo ${X} | tr -s "\)" "_"` ; mv ${X} ${Y} ; done
for X in `find -name *\[*` ; do Y=`echo ${X} | tr -s "\[" "_"` ; mv ${X} ${Y} ; done
for X in `find -name *\]*` ; do Y=`echo ${X} | tr -s "\]" "_"` ; mv ${X} ${Y} ; done
for X in `find -name *\ *` ; do Y=`echo ${X} | tr -s "\ " "_"` ; mv ${X} ${Y} ; done

for X in `find -name *__*` ; do Y=`echo ${X} | sed "s/__/_/g"` ; mv ${X} ${Y} ; done
for X in `find -name *__*` ; do Y=`echo ${X} | sed "s/__/_/g"` ; mv ${X} ${Y} ; done
for X in `find -name *__*` ; do Y=`echo ${X} | sed "s/__/_/g"` ; mv ${X} ${Y} ; done
Název: Re:Rekurzivni prejmenovani souboru dle urciteho znaku
Přispěvatel: Honza1Ubuntu 16. 09. 2018, 11:21:08
Zkusil jsi rovnou detox, co s tím udělá?

To zatim jsem nikdy nezkousel, taky bych mel zkusit. Uz kvuli diakritice, mezeram a dalsim vsude mozne.
Název: Re:Rekurzivni prejmenovani souboru dle urciteho znaku
Přispěvatel: dustin 16. 09. 2018, 11:47:23
Přesně tak. Pokud potřebuješ "detoxikovat" názvy, IMO to nebudeš muset dělat ručně skriptem.
Název: Re:Rekurzivni prejmenovani souboru dle urciteho znaku
Přispěvatel: Kit 16. 09. 2018, 12:16:03
Zapomínáš dávat názvy proměnných do uvozovek.
Název: Re:Rekurzivni prejmenovani souboru dle urciteho znaku
Přispěvatel: mhepp 16. 09. 2018, 13:43:14
Konstrukce for i in ...; do je v tomto případě potenciální zdroj potíží. Je totiž omezená délka seznamu. Lepší konstrukce je find ... | while read i; do.

Název: Re:Rekurzivni prejmenovani souboru dle urciteho znaku
Přispěvatel: Honza1Ubuntu 16. 09. 2018, 13:55:40
Kit

A bude to mit tady vliv pri dani nazvu promennych do uvozvek ? Mezera mezi dvema promenyma ma byt.
Název: Re:Rekurzivni prejmenovani souboru dle urciteho znaku
Přispěvatel: Lol Phirae 16. 09. 2018, 13:58:48
Lepší konstrukce je find ... | while read i; do.

Zkusil bych radši xargs, bude to asi 10x rychlejší...
Název: Re:Rekurzivni prejmenovani souboru dle urciteho znaku
Přispěvatel: Kit 16. 09. 2018, 14:55:37
Kit

A bude to mit tady vliv pri dani nazvu promennych do uvozvek ? Mezera mezi dvema promenyma ma byt.

Jistě, vezme to i ten obrácený apostrof.
Název: Re:Rekurzivní přejmenování souboru dle určitého znaku
Přispěvatel: Honza1Ubuntu 17. 09. 2018, 15:24:15
Kit

Pokud je obraceny apostrov to super-uvozitko
Kód: [Vybrat]
`, tak ho nevezme ani jedna z techto variant, uvozovky nepomuzou. U prvni varianty mi to nevezme "X"

Kód: [Vybrat]
for " X " in `find -name *\`*` ; do "Y"=`echo "${X}" | tr -s "\`" "_"` ; mv "${X}" "${Y}" ; done
bash: `'X'': not a valid identifier

for X in `find -name *\`*` ; do "Y"=`echo "${X}" | tr -s "\`" "_"` ; mv "${X}" "${Y}" ; done
for X in `find -name *\`*` ; do Y=`echo "${X}" | tr -s "\`" "_"` ; mv "${X}" "${Y}" ; done
for X in `find -name *\`*` ; do Y=`echo ${X} | tr -s "\`" "_"` ; mv "${X}" "${Y}" ; done
Název: Re:Rekurzivni prejmenovani souboru dle urciteho znaku
Přispěvatel: gll 17. 09. 2018, 15:48:56
Lepší konstrukce je find ... | while read i; do.

Zkusil bych radši xargs, bude to asi 10x rychlejší...

jedině s parametrem -n,  u xargs bez parametru také narazíte na omezení
Název: Re:Rekurzivní přejmenování souboru dle určitého znaku
Přispěvatel: Kit 17. 09. 2018, 19:09:56
Kit
Pokud je obraceny apostrov to super-uvozitko `, tak ho nevezme ani jedna z techto variant, uvozovky nepomuzou. U prvni varianty mi to nevezme "X"

Celé to máš nějaké chaotické. Samotné X do uvozovek nepatří, vždyť proměnná v l-výrazu nemá ani znak dolaru. Příkaz find se používá jinak, ty hvězdičky také musí být obaleny uvozovkami. Zkus pro začátek tohle:
Kód: [Vybrat]
find -name "*\`*" -exec echo '{}' \;

Ten "for" tam nepatří vůbec, výkonná sekce patří za slovo -exec

Sáhni raději po tom detoxu a máš pokoj.
Název: Re:Rekurzivní přejmenování souboru dle určitého znaku
Přispěvatel: vilma 18. 09. 2018, 15:41:05
Metoda Copy paste programing je zajímavá, ale na fóru root.cz mi přijde pokleslá. Když už, tak si uložit znaky to řetězce, rozbít na pole a iterovat, ale furt  to bude neefektivní, protože se funkce rename zavolát nx víc, než je potřeba (počet souborů . n= počet znaků)
Zkusil bych použít regulerní výrazy  preg_replace ( /:&?.../ , "_" , input)
Název: Re:Rekurzivní přejmenování souboru dle určitého znaku
Přispěvatel: Honza1Ubuntu 20. 09. 2018, 00:40:16
Kit

Pokud se do promenny zada hodnota tak by tam byt ani dolar ani uvozovky nemeli, to jsem jen tak zkousel. Melo by to tedy byt takto:

Kód: [Vybrat]
for X in `find -name "*\-*"` ; do Y=`echo "${X}" | tr -s "\-" "_"` ; mv "${X}" "${Y}" ; done
## a dalsi jine znaky

Ale ten obraceny apostrof to samozrejme nebere. A taky nejde tecka, protoze tou zacina cesta k souboru, tedy se to zacykli. Nakonec tecku nepotrebuji.

Nakonec tam asi bude stejne nejlepsi ten exec. Ale tu konstrukci jsem tolik nepochopil, jak ten znak pak prejmenovat na _ Prave proto je tam ten for cyklus.