Bash hiba

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?

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!

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.

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"

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.

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 :)