Rekurzivní přejmenování souboru dle určitého znaku

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 ?
« Poslední změna: 16. 09. 2018, 21:12:54 od Petr Krčmář »


mhepp

Re:Rekurzivni prejmenovani souboru dle urciteho znaku
« Odpověď #1 kdy: 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.

dustin

Re:Rekurzivni prejmenovani souboru dle urciteho znaku
« Odpověď #2 kdy: 16. 09. 2018, 10:10:24 »
Zkusil jsi rovnou detox, co s tím udělá?

Re:Rekurzivni prejmenovani souboru dle urciteho znaku
« Odpověď #3 kdy: 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

Re:Rekurzivni prejmenovani souboru dle urciteho znaku
« Odpověď #4 kdy: 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.


dustin

Re:Rekurzivni prejmenovani souboru dle urciteho znaku
« Odpověď #5 kdy: 16. 09. 2018, 11:47:23 »
Přesně tak. Pokud potřebuješ "detoxikovat" názvy, IMO to nebudeš muset dělat ručně skriptem.

Kit

Re:Rekurzivni prejmenovani souboru dle urciteho znaku
« Odpověď #6 kdy: 16. 09. 2018, 12:16:03 »
Zapomínáš dávat názvy proměnných do uvozovek.

mhepp

Re:Rekurzivni prejmenovani souboru dle urciteho znaku
« Odpověď #7 kdy: 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.


Re:Rekurzivni prejmenovani souboru dle urciteho znaku
« Odpověď #8 kdy: 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.

Lol Phirae

Re:Rekurzivni prejmenovani souboru dle urciteho znaku
« Odpověď #9 kdy: 16. 09. 2018, 13:58:48 »
Lepší konstrukce je find ... | while read i; do.

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

Kit

Re:Rekurzivni prejmenovani souboru dle urciteho znaku
« Odpověď #10 kdy: 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.

Re:Rekurzivní přejmenování souboru dle určitého znaku
« Odpověď #11 kdy: 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

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Rekurzivni prejmenovani souboru dle urciteho znaku
« Odpověď #12 kdy: 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í

Kit

Re:Rekurzivní přejmenování souboru dle určitého znaku
« Odpověď #13 kdy: 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.

vilma

Re:Rekurzivní přejmenování souboru dle určitého znaku
« Odpověď #14 kdy: 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)