bash segitseg [Megoldva]

Sziasztok,

Sajnos bash szkript irasban nulla vagyok ezert a segitsegetekre lenne szuksegem. Adott egy szoveg fajl amiben a kovetkezo tipusu stringek (fajlnevek) talahatok egyeb szoveg mellett:

xxxxxx.iam
yyyyyy.ipt

a sorok valahogy igy neznek ki:
\konyvtar1\konyvtar2\konyvtar3\xxxxxx.iam

es egy konyvtar amiben hasonlo nevu pdf allomanyok vannak.

Kellene egy szkript ami vegigfut a szovegfajlon es megnezi, hogy talalhato-e hasonlo fajlnevu pdf allomany az adott konyvtarban.
Ha kap hasonlo nevu pdf fajlt akkor ezt a fajlt a szkript masolja at egy adott konyvtarba indexelve, vagyis az elso pdf amit kap legyen 0001.pdf, a masodik 0002.pdf stb.

Mi az ertelme az egesznek? Az, hogy a szovegfajl egy Autodesk Inventor BOM (bill of materials), a pdf fajlok meg a rajzok. A BOM sorrendben van, de a pdf rajzok nincsenek. Ha atmasolom a pdf fajlokat 0001, 0002 stb nevre akkor ezek is sorban lesznek es egy batch print segitsegevel egyszerre ki tudom oket nyomtatni.

Koszi,

Hozzászólások

#! /bin/bash

LISTFILE="/path/to/listfile"
DESTDIR="/path/to/destdir"

declare -i cnt=1

while read filename; do
  pdfname="${filename%.*}.pdf"
  if [ -f "$pdfname" ]; then
    destname="$(printf "%04u.pdf" "$cnt")"
    echo "$pdfname -> $DESTDIR/$destname"
    cp -p "$pdfname" "$DESTDIR/$destname"
    cnt="$(($cnt+1))"
  fi
done < "$LISTFILE"

Disclaimer: fejbol irtam.

Sajnos nem mukodik.

/path/to/listfile helyere a fajlneveket tartalmazo szovegfajl eleresi utjat irtam,
/path/to/destdir helyere pedig azt hogy hova masolja az atnevezet pdf fajlokat.

A script lefut, semmi hibauzenet, de nem csinal semmit. Sajnos tobbet nem tudtam foglalkozni vele mert surgos munkam akadt.

Koszi a segitseget.

--
FeZo

muszi kódja ránézésre teljesen jó, csak nem veszi figyelembe a fájl soraiban található elérési útvonalakat (magyarul az xxxxxx.iam -re jól működne, de a \konyvtar1\konyvtar2\konyvtar3\xxxxxx.iam -re nem).
Kevésbé elegánsan/rugalmasan, de a megadott minta alapján bedrótozva a fájlnevek karakterszámát (6 + . + 3) egyszerűen átírható pl. így:


#! /bin/bash

LISTFILE="/path/to/listfile"
DESTDIR="/path/to/destdir"

declare -i cnt=1

while read filename; do
  pdfname="${filename: -10:6}.pdf";
#A sorban jobbról visszalép 10 karaktert, majd kivág 6 karakternyi sztringet és hozzáfűzi a .pdf -et
  if [ -f "$pdfname" ]; then
#!!Ez csak akkor működik, ha a fájlok(pl. xxxxxx.iam) ugyanabban a könyvtárban vannak, mint a szkript!
    destname="$(printf "%04u.pdf" "$cnt")"
    echo "$pdfname -> $DESTDIR/$destname"
    cp -p "$pdfname" "$DESTDIR/$destname"
    cnt="$(($cnt+1))"
  fi
done < "$LISTFILE"

Bocsi, en szoltam, hogy nem probaltam ki... :-)

basename/dirname helyett hasznalhatod a bash stringdarabolo muveleteit:

basename="${path##*/}"

(torol mindent az elejetol az utolso "/"-ig)

dirname="${path%/*}"

(torol mindent a vegetol az elso "/"-ig)

A faljnevek karakterszamat bedrotozni pedig tenyleg nem jo otlet.

Én perl-ben csinálnám ezt biztos, mert ott tudok kényelmesen, Ilyen fájlnév tördeléseket, meg számláló növelgetéseket csinálni.

Sikerult osszehoznom a szkriptet ami igy nez ki:

#! /bin/bash

LISTFILE="/path/to/listfile"
DESTDIR="/path/to/dest/dir"

declare -i cnt=1

while read filename; do
xxx="${filename##*/}";
pdfname="${xxx%.*}.pdf";

if [ -f "$pdfname" ]; then
destname="$(printf "%04u.pdf" "$cnt")"
echo "$pdfname -> $DESTDIR/$destname"
cp -p "$pdfname" "$DESTDIR/$destname"
cnt="$(($cnt+1))"
fi

done < "$LISTFILE"

Ket szepseghiba:

1. A szovegfajlban az utvonal backslah-el (\) van megadva, ezt a bash nem nagyon szereti, hibat ad a szkript ha az

xxx="${filename##*/}";

sorban a slash-t lecserelem backslash-re. Ezt megoldom egy search/replace-el mielott lefuttatnam a szkriptet.

2. Be kellett iktassak egy xxx koztes valtozot mert egy lepesben nem tudtam a sort lecsonkinani es a fajltipust is lecserelni .pdf-re.

Megegyszer mindenkinek koszonom, most mar csak annyi a dolgom, hogy tomjem a nyomtatot papirral.

--
FeZo

A szovegfajlban az utvonal backslah-el (\) van megadva, ezt a bash nem nagyon szereti, hibat ad a szkript ha az

xxx="${filename##*/}";

sorban a slash-t lecserelem backslash-re. Ezt megoldom egy search/replace-el mielott lefuttatnam a szkriptet.

Akkor irjal ket backslasht (lasd escape-eles):

xxx="${filename##*\\}"

Be kellett iktassak egy xxx koztes valtozot mert egy lepesben nem tudtam a sort lecsonkinani es a fajltipust is lecserelni .pdf-re.

xxx="${filename##*/}"
pdfname="${xxx%.*}.pdf"

Nem baj, de megoldhato ugy is, hogy nem teszel be koztes valtozot (igazabol csak egy valtozonevet sporolsz):

pdfname="${filename##*\\}"
pdfname="${pdfname%.*}.pdf"

most mar csak annyi a dolgom, hogy tomjem a nyomtatot papirral

Jo munkat.