Portál AbcLinuxu, 3. května 2025 22:56
$touch Ahoj\ svete.
. Nebo pokud mas v adresar soubory "a", "a a", "a b". Pri doplnovani se doplni pouze na a. Mezeru je opet treba zadat escapovane. Zkuste si to je to dobre videt.
Proste mezera je v cli peknej opruz.
#!/bin/bash if [ $# -eq 0 ];then echo "Usage: $0 directory ..." else while [ $# -gt 0 ];do if [ -d "$1" ];then find "$1" -mindepth 1 -maxdepth 1 | while read name;do nname="$( echo "$name" | tr 'ĄąÁÂĂÄáâăäĆÇČćçčĎĐďđÉĘËĚéęëěÍÎíłľĹĺŃŇńňÓÔŐÖóôőöŔŕŘřŚŠŞśšşŤťŢţŮÚŰÜůúűüÝýŹŽŻźžż' 'AaAAAAaaaaCCCcccDDddEEEEeeeeIIiiLLllLlNNnnOOOOooooRrRrSSSsssTtTtUUUUuuuuYyZZZzzztszTSZ' | tr 'A-Z' 'a-z' | tr -cs '-0-9a-z_.' '_' | tr -s '-_' '-_' | sed 's/^[-_]\+//;s/[-_]*-[-_]*/-/g;s/[-_]\+\.\/./g;s/\.[-_]\+/./g;' )" if [ "$name" != "$nname" ];then mv -v "$name" "$nname";fi find "$1" -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0r "$0" done shift else echo "Directory $1 does not exist" fi done fi
#!/usr/bin/perl if (scalar(@ARGV)==0) { print "Usage: $0 directory ...\n"; } else { @dirs=@ARGV; while ($dir=shift @dirs) { if (-d $dir) { if (opendir D,"$dir") { @names=readdir D; closedir D; for ($i=0;$i<scalar(@names);$i++) { push @dirs,"$dir/$names[$i]" if (-d "$dir/$names[$i]); $nname=$names[$i]; $nname=~tr/ĄąÁÂĂÄáâăäĆÇČćçčĎĐďđÉĘËĚéęëěÍÎíłľĹĺŃŇńňÓÔŐÖóôőöŔŕŘřŚŠŞśšşŤťŢţŮÚŰÜůúűüÝýŹŽŻźžż\x9D\x9A\x9E\x8D\x8A\x8E/AaAAAAaaaaCCCcccDDddEEEEeeeeIIiiLLllLlNNnnOOOOooooRrRrSSSsssTtTtUUUUuuuuYyZZZzzztszTSZ/; $nname=~tr/A-Z/a-z/; $nname=~tr/-0-9a-z_./_/cs; $nname=~tr/-_/-_/s; $nname=~s/^[-_]+//; $nname=~s/[-_]*-[-_]*/_/g; $nname=~s/[-_]+\././g; $nname=~s/\.[-_]+/./g; if ($nname ne $names[$i]) { print STDERR "Error in rename: $!\n" unless rename "$dir/$names[$i]","$dir/$nname"; } } } else { print STDERR "Unable to open directory $dir: $!\n"; } } else { print STDERR "Directory $dir does not exist\n"; } } }P.S.: Jeste ze fungujou tagy pre, znacky code fungujou nejak podivne a po prvni prazdne radce se asi sami vypnou.
K tomu bashu: cely ten brutal riadok by siel spravit jednym sedom, a usetrit 10 procesov spustanych pre kazdy subor, co by bolo sakra poznat, pri premenovavani velkeho stromu suborov.Jojo, to mas recht. V tomhle pohledu bude urcite ten perl i ten python privetivejsi. Jinak ten "y" (alias tr) v sedu by se pouzit uricte dal, zalezi jaky akceptuje parametry, ale pokud by umoznoval "c" (complement) a "s" (squeeze-repeats), a kdyby sed bral sekvence \x9D, tak by ten radek mohl snad vypadat nejak takhle
nname="$( echo "$name" | sed 'y/ĄąÁÂĂÄáâăäĆÇČćçčĎĐďđÉĘËĚéęëěÍÎíłľĹĺŃŇńňÓÔŐÖóôőöŔŕŘřŚŠŞśšşŤťŢţŮÚŰÜůúűüÝýŹŽŻźžż\x9D\x9A\x9E\x8D\x8A\x8E/AaAAAAaaaaCCCcccDDddEEEEeeeeIIiiLLllLlNNnnOOOOooooRrRrSSSsssTtTtUUUUuuuuYyZZZzzztszTSZ/;y/A-Z/a-z/;y/-0-9a-z_./_/cs;y/-_/-_/s;s/^[-_]\+//;s/[-_]*-[-_]*/-/g;s/[-_]\+\.\/./g;s/\.[-_]\+/./g;' )"Tak ted jsem to overoval a zda se, ze muj sed (GNU sed version 4.1.5) umi \x9D, ale bohuzel neumi y/// s ruznyma dylkama a navic tudiz nelze zapsat nahrazeni complement seznamu a navic y/// nebere parametry, cili selhava prikaz
y/-0-9a-z_./_/cs"strings for `y' command are different lengths" a po smazani pak selhava i
y/-_/-_/s;"extra characters after command". Takze na jednoduchy zmeny to y/// v sedu staci, na slozitejsi je lepsi perl nebo tr.
Na druhej strane, to rekurentne volanie sa mi fakt paci a asi ho tiez zacnem pouzivatKazdej den se neco novyho ucime
y/-0-9a-z_./_/csby slo spravit prikazom (pri ERE, ale to je jedno, je to iba kvoli nazornosti)
s/[^-0-9a-z_.]+/_/ga
y/-_/-_/sby slo spravit cez
s/([-_])\1*/\1/g(BTW prikaz
tr -s '-_' '-_'
mi nefacha a musim pouzit tr -s -- '-_' '-_'
ale moze to byt verziou tr)
cmp1(renamer, u'ůěščřžýáíé', u'uescrzyaie') cmp1(renamer, u'úďťňó', u'udtno') cmp1(renamer, u'ĚŠČŘŽÝÁÍÉ', u'ESCRZYAIE') cmp1(renamer, u'ÚĎŤŇÓ', u'UDTNO')ad 3) hmmm, nevim, me ten bash i perl skript pripada jednodussi, zadny objekty , proste za sebou par tr a s prikazu s jednoduchou syntaxi ad 4) hmmm, pravda, python jsem na woknech nezkousel, ale perl na woknech urcite funguje a bash taky (at uz pod celym cygwinem, nebo pouze s vybrakovanym cygwin DLL a prislusnyma balickama, nebo taky jako v projektu gnuwin32.sf.net) Ale jeste jsem ted mrknul na tu tridu a celkove objektovej navrh a rekl bych, ze by bylo lepsi, kdybys tu tridu udelal jako podtridu tridy String (napr. UntidyFileName) a v ni definoval metodu cleanName a pak to volala jako newname=oldname.cleanName. Protoze volani renamer.cleanName(oldName) je podle me presne ta prasarna, kterou splodi clovek zvyklej na programovani s funkceme, kterej zrovna presel na nejakej jazyk s objektama. A proto se mi taky nelibi Python, protoze self.re_invalid_stuff = re.compile(r"[^a-zA-Z0-9_\.-]+") a self.re_invalid_stuff.sub("_", fileName) nepovazuju za objektovej pristup a cekal bych spis fileName.subst(r"^[-_]+","_"). Jak se to (a) zkratilo, a (b) zprehlednilo, co? Dokud proste bude jazyk kombinovat funkce a operatory s metodama, tak to nebude poradnej OO jazyk (tim samozrejme myslim i Javu, Perl a dalsi pseudo OO jazyky
#!/bin/bash # prejmenovat.sh srcenc=latin2 while [ -n "$1" ] do n="$(iconv -f "$srcenc" -t "ascii//TRANSLIT" <<< "$1" )" mv "$1" "$n" rename 's/ +/_/g;y/A-Z/a-z/' "$n" shift 1 done
find . -depth | xargs prejmenovat.shJoo, je to trošku neefektivní a ty regexpy u rename budou chtít trošku doladit, ale v zásadě by to fungovat mělo... ps: Netestoval jsem to.
NAME rename - Rename files SYNOPSIS rename from to file... DESCRIPTION rename will rename the specified files by replacing the first occurrence of from in their name by to. For example, given the files foo1, ..., foo9, foo10, ..., foo278, the commands rename foo foo0 foo? rename foo foo0 foo?? will turn them into foo001, ..., foo009, foo010, ..., foo278. And rename .htm .html *.htm will fix the extension of your html files.Takze to bude asi ciste na string-to-string konverzi, zadny regulary. Nebo mas jinou verzi? Ja mam "rename from util-linux-2.12r" (kterej manas to do CZ prelozil jako "rename na util-linux-2.12r"???) Jinak tech regexpu ti tam jeste par chybi
document.getElementById("dlcounter").innerHTML = 'Please wait <b>'+x1786+'</b> seconds'a URL na stahovanej soubor se tvori pomoci JS funkci, napr.
document.getElementById("download_html").innerHTML = '<a href="Array" class="downloadhtml" onclick="loadingdownload();">Click here to download</font></a>'; var a = String.fromCharCode(Math.abs(-101)); var d = '5' + String.fromCharCode(Math.sqrt(3249)); document.getElementById("dlbutton").innerHTML = '<a href="http://www41.megaupload.com/files/2a9f31' + d + a + 'afac798acff4e54a6c927d7/ANTOINE DE SAINT-EXUPÉRY - Malý Princ.pdf" onclick="loadingdownload();"><IMG SRC="" WIDTH="165" HEIGHT="39" BORDER="0" ALT="" id="dlimage" onmouseover="dlimg.src=this.src;this.src=dlimgover.src;" onmouseout="this.src=dlimg.src;"></a>';document.getElementById('dlcounter').style.display = 'none';document.getElementById('dlcounterimg').style.display = 'none';document.getElementById('dlimage').src = dlimg.src;Takze jsem na to udelal jednoduchej JS parser a interpret
size="x576" for i in *.jpg *JPG do echo "$i" convert -sample $size $i nahledy/$i doneSam pouzivam v tomto skriptu size="800x800>", coz mi zmensi vsechny obrazky, aby vetsi rozmer nebyl pres 800px.
pic-1.jpg JPEG 2304x1728 2304x1728+0+0 DirectClass 8-bit 902.07kb pic-2.jpg[1] JPEG 1728x2304 1728x2304+0+0 DirectClass 8-bit 1.20726mb 0.360u 0:02 $ convert -verbose pic-1.jpg -resize x600 pic-1-a.jpg pic-1.jpg JPEG 2304x1728 2304x1728+0+0 DirectClass 8-bit 902.07kb pic-1.jpg=>pic-1-a.jpg JPEG 2304x1728=>800x600 800x600+0+0 DirectClass 16-bit 97.8203kb 0.810u 0:02 $ convert -verbose pic-2.jpg -resize x600 pic-2-a.jpg pic-2.jpg JPEG 1728x2304 1728x2304+0+0 DirectClass 8-bit 1.20726mb pic-2.jpg=>pic-2-a.jpg JPEG 1728x2304=>450x600 450x600+0+0 DirectClass 16-bit 102.682kb 0.620u 0:02Je to to, co jsi potreboval?
pisnicka.mp3
a písnička.mp3
?
Jinak pro samotné zbavení se diakritiky se dá použít v příkazové řádce příkaz unaccent (1)
.
#!/bin/bash if [ $# -eq 0 ];then echo "Usage: $0 directory ..." else while [ $# -gt 0 ];do if [ -d "$1" ];then find "$1" -mindepth 1 -maxdepth 1 | while read name;do nname="$( echo "$name" | tr 'ĄąÁÂĂÄáâăäĆÇČćçčĎĐďđÉĘËĚéęëěÍÎíłľĹĺŃŇńňÓÔŐÖóôőöŔŕŘřŚŠŞśšşŤťŢţŮÚŰÜůúűüÝýŹŽŻźžż' 'AaAAAAaaaaCCCcccDDddEEEEeeeeIIiiLLllLlNNnnOOOOooooRrRrSSSsssTtTtUUUUuuuuYyZZZzzztszTSZ' | tr 'A-Z' 'a-z' | tr -cs -- '-0-9a-z_.' '_' | tr -s -- '-_' '-_' | sed 's/^[-_]\+//;s/[-_]*-[-_]*/-/g;s/[-_]\+\.\/./g;s/\.[-_]\+/./g;' )" if [ "$name" != "$nname" ];then if [ -e "$nname" ];then i=0 oname="$nname" while [ -e "$nname" ];do nname="$( printf "%s.%05i" "$oname" $i )";i=$[$i+1];done fi mv -v "$name" "$nname" fi find "$1" -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0r "$0" done shift else echo "Directory $1 does not exist" fi done fi
#!/usr/bin/perl if (scalar(@ARGV)==0) { print "Usage: $0 directory ...\n"; } else { @dirs=@ARGV; while ($dir=shift @dirs) { if (-d $dir) { if (opendir D,"$dir") { @names=readdir D; closedir D; for ($i=0;$i<scalar(@names);$i++) { push @dirs,"$dir/$names[$i]" if (-d "$dir/$names[$i]); $nname=$names[$i]; $nname=~tr/ĄąÁÂĂÄáâăäĆÇČćçčĎĐďđÉĘËĚéęëěÍÎíłľĹĺŃŇńňÓÔŐÖóôőöŔŕŘřŚŠŞśšşŤťŢţŮÚŰÜůúűüÝýŹŽŻźžż\x9D\x9A\x9E\x8D\x8A\x8E/AaAAAAaaaaCCCcccDDddEEEEeeeeIIiiLLllLlNNnnOOOOooooRrRrSSSsssTtTtUUUUuuuuYyZZZzzztszTSZ/; $nname=~tr/A-Z/a-z/; $nname=~tr/-0-9a-z_./_/cs; $nname=~tr/-_/-_/s; $nname=~s/^[-_]+//; $nname=~s/[-_]*-[-_]*/_/g; $nname=~s/[-_]+\././g; $nname=~s/\.[-_]+/./g; if ($nname ne $names[$i]) { if (-e $nname) { $i=0; $oname=$nname; while (-e $nname) { $nname=sprintf("%s.%05i",$oname,$i++); } } print STDERR "Error in rename: $!\n" unless rename "$dir/$names[$i]","$dir/$nname"; } } } else { print STDERR "Unable to open directory $dir: $!\n"; } } else { print STDERR "Directory $dir does not exist\n"; } } }
tr
už zmíněný unaccent
a perl by snad měl umět rozložit akcentovaný znak na kombinující akcent a samotný znak a poté akcenty vyříznout.
Potřeboval jsem to rozjet pod winxp a cygwinem (tr nefungoval). Výsledek vypadá následovně. PS: Je tam opravena chybka viz druhé find. Filtruji .svn adresáře. Změna kalkulace i+1, původní pod bas v cygwin nefungovala. S unaccent viz dále v diskusi by to bylo asi výrazně rychlejší. IFS je asi zbytečné měnit.
#!/bin/bash
srcenc=cp1250
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
if [ $# -eq 0 ];then
echo "Usage: $0 directory ..."
else
while [ $# -gt 0 ];do
if [ -d "$1" ];then
find "$1" -mindepth 1 -maxdepth 1 -type f | grep -v ".svn" | while read name;do
echo "INFO: Filename - $name"
nname="$(iconv -f "$srcenc" -t "ascii//TRANSLIT" <<< "$name" )"
nname="$(echo "$nname" | sed -e "s/'//g" )"
if [ "$name" != "$nname" ];then
if [ -e "$nname" ];then
echo "WARNING: Filename already exist - $nname"
i=0
oname="$nname"
while [ -e "$nname" ];do nname="$( printf "%s.%05i" "$oname" $i )";i=$(($i+1));done
fi
svn rename "$name" "$nname"
fi
done
find "$1" -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0r "$0" | sed -e "s:[-a-zA-Z0-9_/. \]*.svn ::g"
shift
else
echo "Directory $1 does not exist"
fi
done
fi
# restore $IFS
IFS=$SAVEIFS
Cannot rename: ./spole�ensk� 48.txt , exceptions.UnicodeDecodeErrorNavic mi unika, jak dosahnout vycisteni podadresaru a jak pustit skript na jiny adresar, nez ve kterem je .py umisten.
Readonly directory: ././Smaž mnei kdyz jsou volna prava pro vsechny. Stejne dopadne spusteni scriptu pod rootem, to uz nechapu, zrejme nebude chyba v pravech adresare.
drwxrwxrwx 2 dan dan 4,0K 2007-12-03 18:03 Smaž mneDiky za pomoc.
pri zpracovani zahlasiJsi prvni, kdo tu chybu opravdu zaznamenal (vsichni diskutuji, ale nikdo si to nevyzkousi). Ja jsem ji nasel az po zverejneni clanku a uz jsem ji tam opravil. Na konci clanku jsem zalozil seznam chyb, aby slo sledovat zmeny. Zkusim se podivat, kde vlastne pada ta konverze a co s tim, ale neslibuji, ze to bude hned.Readonly directory: ././Smaž mnei kdyz jsou volna prava pro vsechny.
vycisti.py -c cp1250a melo by to spravne prejmenovat, mne to funguje, a to mam nejspis identicky system. Zkopiruj si stavajici verzi, predtim tam bylo vic chyb. Obecne se da rict, ze pokud mas adresar, u ktereho jsi si jisty, ze je tam blbe (asi windows) kodovani, tak spust skript nejdriv tak, jak jsem uvedl vyse. Jsou totiz znaky, ktere se daji nejakou nahodou prevest do unicode, ale skript je nakonec zrusi a nahradi podtrzitkem (vysledek by treba mohl byt 'spole_ensk_kronika_48.txt'), takze bys pak musel jeste rucne nahrazovat podtrzitka.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.