Van egy scriptem, amiben van egy ilyen rész:
if [ ! -e *_$DATE*.xml ]; then
echo -e "nincs az adott datumhoz tartozo fajl."
A gondom az, hogy nagyon sok (több ezer) fájllal kell dolgoznom, így futttáskor ezt a hibaüzenetet kapom:
archive_upload.sh: line 20: [: too many arguments
A fenti if-es sor a hibaüzenetben írt 20. sor.
Miként lehetne a fenti kódot úgy átírni, hogy ne kapjak hibaüzenetet?
- 1370 megtekintés
Hozzászólások
for i in *_$DATE*.xml; do
if [ ! -e $i ]; then
echo -e "nincs az adott datumhoz tartozo fajl."
fi
done
--
A nyúl egy igazi jellem. Ott ül a fűben, de akkor sem szívja!
- A hozzászóláshoz be kell jelentkezni
Úgy rémlik, hogy eredetileg for-ral írtam meg én is, de úgy is volt valami gondom.
- A hozzászóláshoz be kell jelentkezni
Vagyis az -e operátornak csak egy argumentuma lehet, viszont a *_$DATE*.xml több fájlra is illeszkedik. Tehát nem az a baj, hogy eleve sok a fájlod.
- A hozzászóláshoz be kell jelentkezni
Aha, így már érthető.
Kitalaltam egy ilyet:
if `ls *_$DATE*.xml | grep '' -c` == 0; then
echo -e "nincs az adott datumhoz tartozo fajl.";
fi
Erre meg ilyet dob:
ls: *_20070517*.xml: Nincs ilyen fájl vagy könyvtár
Ezt hogyan tudom eltüntetni?
- A hozzászóláshoz be kell jelentkezni
ls *_$DATE*.xml 2>/dev/null | ...
?
- A hozzászóláshoz be kell jelentkezni
Jónak tűnik. Köszi!
- A hozzászóláshoz be kell jelentkezni
Az a baj, hogy a shell * az nagyon érzékeny, ha túl sok fájlnév van (nem kettő, hanem mondjuk 30000), akkor mindenképpen hibás lesz, ha shell glob-ot használsz. Elsőre ez a megoldás jutott eszembe, ami teljesen általános, és minden esetre jól működik:
find . -type f -wholename '*_$DATE*.xml' | grep -q . || echo "nincs ilyen"
- A hozzászóláshoz be kell jelentkezni
Csak akkor, ha egy processz argumentumlistáját tölti fel, ui. ezt a kernel limitálja. Ha egy shell builtin kapja, akkor csak a rendelkezésre álló memória a korlát.
- A hozzászóláshoz be kell jelentkezni
Az a baj, hogy az eredeti feladat az volt, hogy írja ki, ha _nincs_ ilyen fájl. Erre szerintem egyszerű megoldás amit adtam. A többiek megoldásai nem teljesek. Ez lenne a teljes shell megoldás:
EXISTS=0
for FILE in *_$DATE*.xml; do
EXISTS=1
break
done
if [ "$EXISTS" == 0 ]; then
echo "nincs ilyen"
fi
Ami lássuk be, elég csúnya és nehezen átlátható. Egyébként az enyém se optimális, így már jobb:
find . -type f -wholename '*_$DATE*.xml' -print -quit | grep -q . || echo "nincs ilyen"
Ez csak az első találatig keres.
- A hozzászóláshoz be kell jelentkezni
overkill, try this:
test ! $(for _ in *_$DATE*.xml; do echo 1; break; done) && echo "nincs ilyen"
- A hozzászóláshoz be kell jelentkezni
Rájöttem, hogy ez így nem jó (a tiéd se, bár szebb, mint az én csúnyábbik megoldásom :)), ki lett felejtve belőle az "if [ -e" rész. Szóval végül is lehet így:
( for i in *_$DATE*.xml; do if [ -e $i ]; then exit 1; fi; done ) && echo "nincs ilyen"
De a find-os szerintem jobban érthető. Persze ez megítélés kérdése :)
- A hozzászóláshoz be kell jelentkezni
Az övébe azért nics if mert nem kell bele.
a if [-e $i] ... rész helyettesíthető [-e $i ] -vel mert a [ parancs amúgy is 1-gyel tér vissza ha false.
- A hozzászóláshoz be kell jelentkezni
ja igen. kifelejtettem a 'shopt -s nullglob'-ot, de az enyemnel a *_$DATE*.xml csak letezo fileokra helyettesitodik, szoval folosleges a plusz ellenorzes ugy gondolom..
- A hozzászóláshoz be kell jelentkezni