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,
- 1256 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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"
- A hozzászóláshoz be kell jelentkezni
Miért kell a fájlnevek karakterszámát bedrótozni?
dirname parancs megadja a fájlnév könyvtárát, a basename meg a fájlnevet, opcionálisan kiterjesztés nélkül.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Egyetértek a drótellenességgel, viszont leggyorsabb eszembe jutó/kézre álló hack ez volt :-)
(főleg úgy, hogy a példában fix méretű fájlnevek voltak, így nem kellett escape-elésen és szintaktikán agyalni :)
- A hozzászóláshoz be kell jelentkezni
É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.
- A hozzászóláshoz be kell jelentkezni
Én shell-ben is tudok ilyeneket kényelmesen csinálni.
(Szóval csak annyi akart lenni, hogy: ÉS?)
- A hozzászóláshoz be kell jelentkezni
Igazad van. Csak az én nézőpontomből úgy tűnt hogy segítek.
Akkor semmi probléma. Világért sem akaroktam ebből érzelmi kérdést csinálni.
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni