Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: On 16 Dubna 2009, 13:09:39
-
Nadpis v podstatě řekl vše, je nějaká finta, jak to udělat, aby po napsání řetězce BASH bral v potaz velká i malá písmena? Resp, aby je nerozlišoval..?
Dělám si skript na hromadné přejmenování souborů...už je hotový a funkční, jen bohužel rozlišuje velikost, tak bych to chtěl ještě doladit..
-
ukaz skript .. a napis prosim srozumitelne co s tim chces delat
-
#!/bin/bash
clear
echo -n "Zadej cestu k prohledávání: "
read cesta
echo -n "Zadej hledaný řetězec(bez mezer): "
read retezec
echo Hledám ...
find $cesta -iname *$retezec*
echo -n "Zadej řetězec k nahrazení: "
read prom
echo -n "Zadej nahrazení řetězce '$prom': "
read promr
for i in $(find $cesta -iname *$prom* -type f); do
if [ $? -eq 0 ]; then
mv $i ${i//$prom/$promr}
echo Přejmenovávám $i ...
else echo Soubor nenalezen ...
echo
fi
done
Není to finální verze, vše se ještě doladí...pointa je ale v tom, že u vstupu "Zadej řetězec k nahrazení", se napíše nějaký řetězec, např "text" a já chci, aby vyhledal ne jen řetězec "text", ale aby taky našel "Text" nebo "TEXT", prostě bez ohledu na velikost..
edit: teď mě tak napadá, on vlastně vyhledá tento "text" bez ohledu na velikost písmen, k tomu slouží u příkazu "find", parametr "-i", který tam mám, ale cosi mi to nechce změnit....
Problém je v tom, že se do proměné uloží přesně to, co napíšu na ten vstup..a otázka zní, jestli to teda jde udělat tak, aby v té proměné nerozlišoval velikost písmen
-
1) Proč pouštíš zbytečně find po tom co to napíše Hledám ...
2) Možná bude lepší než to všechno vypisovat do toho při běhu skriptu, to předávat jako parametr skriptu, myslím tím to read cesta, retezec, prom, promr
3) Když u find funguje vyhledání, který nerozlišuje malý a velký písmena tak není to jedno jestli tam použiješ proměnou text nebo TeXt a podobně ?
Zdá se mi to nějaký divný ???
Co je tohle ? mv $i ${i//$prom/$promr}
taky mi tam přijde zbytečný testovat if [ $? -eq 0 ]; then
-
1, ty kosmetické úpravy, to většinou řeším až na konci, funkci to plní, tak to bych nějak zatím neřešil
Jinak za běhu skriptu to dělat musím..nejdřív dojde na hledání, kde mnohdy neznám přesně to, co chci zaměnit, takže nejdřív mi to vyhledá, vypíše, co našel a až pak se rozhoduju, co vlastně chci zaměnit..A u toho find to sice vyhledá bez rozlišení, ale vzhledem k tomu, že se do proměné "prom" napíše nějak definovaný řetězec, např ten "text", tak on bude brát k záměně jen to "text"...jestli najde v jiném souboru "TEXT", už ho nevezme, pač je to dané tou proměnou "prom"...ale...možná jsem nepochopil, cos mi chtěl přesně říct, tak se kdyžtak omlouvám :)
-
Asi nějak přesně nechápu jak to má fungovat, když tak to sem napiš podrobně a já se na to doma mrknu ;)
-
Ten test máš pravdu, že tam být nemusí...já jen, kdyby nic nenašel, ať mi napíše hlášku, že prostě nic nenašel, ale to je jedno.. to mv $i ${i//$prom/$promr}, nad tím jsem strávil hodně času, než jsem přišel na to, jak zaměnit nějaký řetězec podle toho, co napíše uživatel, tak prosím chválu :D
znamená to přejmenuj $i (to je nalezený soubor, resp soubor předaný od příkazu find) a v něm řetězec $prom (to je řetězec, který zadá uživatel na změnu) změň na $promr (což je řetězec, který zadá uživatel, za který se má zaměnit)...asi to půjde mnohem jednodušeji, nějak přes "sed" nebo tak něco, ale jaksi mi to nešlo..
Podrobný popis: mám např 3 soubory: florBAL, FLOrbal, FLORBAL...všechny tyto soubory chci přejmenovat na "florbal"
Vyhledání funguje tak, že vše najde bez ohledu na velikost písmen a teď jde o to, aby při záměně bral v potaz řetězec "florbal", bez ohledu na velikost písmen...pač do proměné prom když napíšu "florbal", tak samozřejmě zamění jen tento konkrétní řetězec..
-
Podrobný popis: mám např 3 soubory: florBAL, FLOrbal, FLORBAL...všechny tyto soubory chci přejmenovat na "florbal"
No 3 soubory se stejným názvem mít nemůžeš ;D
Takže chceš soubory co jsou psaný malým a velkým písmem přepsat na jen malý písmo jo ?
-
To měl být jen příklad...asi teda blbý :D...měl jsem na mysli např florbAL.txt, FLORBAL.bla a FLOrbal-trenink.baf :) Ale pointu jsi vystihl...v tomhle případě, aby to přejmenovalo na malé písmena...jindy zase třeba na velké, prostě co si zadám
-
#!/bin/bash
usage() {
cat << EOF
./renamer.sh <path> <expression> <sub_expression>
path : cesta kde se bude rekurzivne prohledavat
expression : co se nahradi ve jmenech souboru ..
sub_expressin : za co ..
EOF
exit 1;
};
if test $# -ne "3"; then
echo "bad parameters ..";
usage;
fi
if test ! -d "$1"; then
echo "no such a path: $1";
usage;
fi
PATHX=$1;
cd $PATHX;
find . >/tmp/renamer.tmp &
PID=$!;
while test ! -z $(ps -o pid | grep "^$PID$"); do
for x in / - \\ \|; do
echo -ne "searching $x \r";
sleep 0.2;
done
done
echo;
echo "files matching $2 will be changed this way: ";
grep -i "$2" /tmp/renamer.tmp | while read line; do
echo "$PATHX/$line -> $PATHX/$(echo $line | sed s/$2/$3/ig)";
done
> ls; ~/myscripts/renamer.sh . bc xx
abcd aBcD ABCD
files matching bc will be changed this way:
././ABCD -> ././AxxD
././aBcD -> ././axxD
././abcd -> ././axxd
## fuj. je to ale taky pomerne hnusnej kod .. njn. bash je obsolete a dnes uz bych v nem dobrovolne nic nepsal
-
ad.1) nikdy, opravdu nikdy nepouzivejte (jak to delam blbe ja) uppercase na pojmenovavani vasich promennych !! promenne uppercasem pojmenovava system !!
-
Hm..no...sice v BASHi nedělám dlouho, ale myslel jsem si, že už ho docela chápu - byl to omyl :D No nic, jdu ten zdrojový kód trochu prostudovat...díky :)