Portál AbcLinuxu, 29. října 2025 15:03
$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.
ls -l "a[SPACE][TAB] pak doplni zbytek spravne bez "\"
Jeste predem trochu k FATu. FAT 8+3 pouzival standardne tusim velky pismena pri zapisu jmena na disk, jinak uzivatel nazvy zadava case-insensitive. Ve verzi vfat (delsi jmena nez 8+3) bylo mozna tusim zapisovat velka i mala pismena ve jmene souboru, ale Windows/DOS to nerozlisoval, cili "A" bylo stejny jako "a". Nevim, jak presne se chovaly programy ve Windows, ale je fakt, ze linux odmita prejmenovat soubor "A" na "a" na pripojenym vfat oddile, protoze je to proste stejny soubor, takze pokud chces opravdu delat upper-case na lower-case, musi se to resit pres temp soubor. Osobne bych ale velky pismena nechaval, aspon na linuxu mi to vyhovuje.
A jeste nez zacnu, tak ti musim Tomiku napsat, ze ses fakt dobrej, ze jsi takovouhle funkcnost napsal v pythonu a objektove. Tohle je skutecny uznani, ne ironie.
Jeste jemny rejpnuti/ironie: ted uz musis v pythonu napsat jenom vlastni OS, pod kterym bys ten svuj skript spoustel
A ted vazne. Zda se mi, ze na zadani odstranit diakritiku, písmena změnit na malá, nepohodlné znaky nahradit podtržítkem. Poté se ještě vyhodí nepotřebné znaky '_' a '-' kolem teček, více znaků '_' nebo '-' nahradí jenom jedním a sekvence '-' a '_' se nahradí jenom jednou pomlčkou. jsi pouzil skutecne zbytecne silnej jazyk a napsal jsi opravdu drsnej program. Protoze vyznavam boha roury pipe, tak bych osobne na to vyuzil spis moznosti textovych a souborovych utilit, pripadne bych to napsal v perlu, asi nejak takhle (varovani pro pripadne testery-skripty jsem nezkousel, mozna budou potrebovat doladit!!!). Objekty se mi tady proste moc nezdaji. Tak jestli nekdo bude prahnout po python-free reseni, tak prosim ...
#!/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.
. Tohle bych vymyslel cely den.
Jinak ale je pravda, ze spousta lidi neobjevi ty skvely moznosti linuxovych utilitek a pak jim windows cmd pripada stejne silnej jako bash+gnu nastroje. Bohuzel pravda je jina a cmd samo o sobe i s tou chabou vybavickou pseudo nastroju ve windows neumi vubec nic oproti bashi s armadou find-utils, text-utils, file-utils atd (dnes tusim uz vsechno v baliku core-utils). Spousta lidi napr pouziva grep jenom na hledani slova a vyuziti regexpu se vyhybaji, stejne tak sed je silnej nastroj na editaci text streamu. No a kouzla s rourama a sub-shellama jsou pak uz docela sileny. Ale i tak to neni vsechno a existuji dalsi magicky triky, o kterych ani ja nemam paru.
BTW: Ted jsem si vsimnul, ze to v tom bashi rozhodilo cesky znaky pro Windows, tj. , puvodne to maji byt znaky s hodnotama 0x9D 0x9A 0x9E 0x8D 0x8A 0x8E, jak je uvedeno v perl skriptu, ale treba taky nevim, jak bych nacpal do bashe znaky pomoci nejaky hexa sekvence, jako napr. v perlu pomoci \x9D atd. Aha, koukam, to neni rozhozeny - ono je to asi jenom v UTF8 a tam ty znaky nemaji zadnej vyznam, tak je tam ve ctverecku pod sebou napsano "00" a "9D", "00" a "9A" atd. No, tady je videt, ze M$ zase neco podelal a misto aby pouzili ISO-8859-2, tak vymysleli nejakou ptakovinu, ktera je az na tehle sest pismen stejne s ISO, ale znaky ť, š a č jsou jiny.
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
A nikdy neumime vsechno
BTW: Nejsem si ted vedom, ze bych ho ja sam nejak casto vyuzival, ale tady mi zrovna hoodne pomohlo
, tak
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)
Ja jsem akorat nacpal kompletne vsechny, i ty nepouzivane v CJ (vetsinou totiz problem delaji prave ty cizi znaky), ale mohl bych vypsat pouze CZ. Jinak by me taky zajimalo, jak si s tim prevodem do utf poradi python, kdyz tam bude nejakej znak mimo tu prednastavenou kodovou stranku (napr. bude na woknech a nastavis cp1250 a pak pouzijes nejaky pismeno, ktery bude iso). Napr. iconv na tom spadne.
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
).
Adresář plný .ttf a z nich je potřeba vytvořit třeba pdf (nebo něco jiného, co by šlo vytisknout), kde bude vždy název písma a pak ukázka toho písma (prostě kousek napsanej tím písmem) a ještě nejlépe tak, aby nebylo na výsledném papíře zbytečně mnoho volného místa. Tak co, je to výzva, že?
#!/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.
Blby je, ze mi iconv chcipal, pokud ve zdrojovej sade byl nejakej znak mimo definovanej. Takze kdyz budu mit mix iso a cp1250 nebo pripadne v cp1250 nejakej paznak, tak iconv chcipne. Ale jinak bych taky asi sel do iconvu.
Ten rename nevim, jestli by fungoval. Podle manu
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
To je dobry, taky jsem si nedavno vlastni napsal, funkce prakticky stejna, akorat mam moznost vice IP adres, takze mam seznam proxy serveru a kdyz mi rapid napise "cekej 200minut", tak se pouzije jinej proxy. Pred par dny jsem taky napsal stahovac pro megauploads
Ten megauploads je pekne hnusnej. Odpocitavaci promenna se meni a ma podivny jmeno, napr.
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
Zatim umi jenom funkce/metody String.fromCharCode(), Math.abs() a Math.sqrt() a operaci "+"
Ani jsem necekal, ze to bude fungovat, ale jede to
Nejsou sice uplne dokonaly, ale pro moje potreby zatim staci. Pri zmenach stranek budu muset holt upgradovat.
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) .
Takze opravene i pro tenhle pripad .... (plus upraveno tr -s '-_' na tr -s -- '-_' ...)
#!/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.