Portál AbcLinuxu, 26. října 2025 09:43
Zdravim mam problem se soubory s mezerou v nazvu. Mam skript:
nasel=`grep -l -e $cislo *`
for vysledek in $nasel
do
echo "Soubor "$vysledek" obsahuje hledany retezec "$cislo
cat $CESTA/$vysledek | grep $cislo
done
Vsechno funguje dobre jen do chvile nez vyhleda soubor, ktery ma v nazvu mezery. Napr. pro soubor "1 2.out" se pak provede cyklus dvakrat pro vysledek 1 a podruhe pro vysledek 2.out, ale jelikoz zadne takove soubory neexistuji tak pak selze cat. Hledal jsem reseni a nasel jsem neco jako IFS, ale moc jsem to nepochopil. Dekuji za rady
\n, tak by to možná fungovalo, ale asi by to upadlo na souboru, který obsahuje znak nového řádku
.
Co to přepsat takhle?
for soubor in *; do
if grep -e "$cislo" -q "$soubor"; then
echo "Soubor $soubor obsahuje $cislo.";
grep -e "$cislo" "$soubor";
fi
done
Buď jak buď, určitě potřebujete vypisovat tu hlášku? -- takhle se totiž grep volá 2×.
Skript jsem pro tento dotaz zjednodusil, aby v nem bylo jen to potrebne. Tu hlasku mam podminenou parametrem z prikazove radky a opravdu ji vypisovat potrebuji.
if [ -z $SOUBOR ]
then
nasel=`grep -l -e $cislo * | grep -v $DAVKA`
else
nasel=`grep -l -e $cislo * | grep -v $DAVKA | grep -v $SOUBOR`
fi
for vysledek in $nasel
do
cd $VYSTUP
echo "Soubor "\"$vysledek\"" obsahuje hledany retezec "$cislo
if [ $VYPIS -eq 1 ]
then
cat $CESTA/\"$vysledek\" | grep $cislo
fi
done
Vase reseni funkcni je, ale cyklus se provadi nad kazdym souborem. Chtel jsem se vyhnout duplicite ve skriptu. Nejak me to vubec nemysli.
find -not -name "$DAVKA" | while read soubor; do if grep ... fi doneBTW - pokud do
$VYPIS místo 1 dáte true (a pro 0 pak false), můžete ten výpis zkrátit na
$VYPIS && grep "$cislo" "$CESTA$vysledek"
nastudujte jaký je rozdíl mezi "$cislo" a $cislo
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.