Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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:
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 ?
-
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.
-
Zkusil jsi rovnou detox, co s tím udělá?
-
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.
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
-
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.
-
Přesně tak. Pokud potřebuješ "detoxikovat" názvy, IMO to nebudeš muset dělat ručně skriptem.
-
Zapomínáš dávat názvy proměnných do uvozovek.
-
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.
-
Kit
A bude to mit tady vliv pri dani nazvu promennych do uvozvek ? Mezera mezi dvema promenyma ma byt.
-
Lepší konstrukce je find ... | while read i; do.
Zkusil bych radši xargs, bude to asi 10x rychlejší...
-
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.
-
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"
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
-
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í
-
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:
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.
-
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)
-
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:
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.