find/xargs проблемче
4 отговора
126 прегледа
find/xargs проблемче
имам template файлове в диреткория ./template (с файлове и поддиректории) искам да ги обработя и да получа резултата в ./build
аз съм го направил с 2 файла
build.sh:
#!/bin/bash
DESTINATION=build
rm -r -f $DESTINATION
cp -r template $DESTINATION
find $DESTINATION/ -type f -exec ./build.one.sh '{}' ';'
и build.one.sh:
#!/bin/bash
cat $1 | tplprocess > $1
струва ми се, че трябва да може да стане с един файл, но не мога да се оправя със синтаксиса на find,
също така ако има някой идеа да се направи всичко още при самото копиране, а не както е сега първо cp и после find
благодаря
аз съм го направил с 2 файла
build.sh:
#!/bin/bash
DESTINATION=build
rm -r -f $DESTINATION
cp -r template $DESTINATION
find $DESTINATION/ -type f -exec ./build.one.sh '{}' ';'
и build.one.sh:
#!/bin/bash
cat $1 | tplprocess > $1
струва ми се, че трябва да може да стане с един файл, но не мога да се оправя със синтаксиса на find,
също така ако има някой идеа да се направи всичко още при самото копиране, а не както е сега първо cp и после find
благодаря
Re: find/xargs проблемче
Избягвай да правиш неща като
Понякога работят, понякога не. Според мен това, че работят (особено пък понякога) е бъг в bash.
cat $1 | ... > $1
Понякога работят, понякога не. Според мен това, че работят (особено пък понякога) е бъг в bash.
Re: find/xargs проблемче
:-) тогава ще трябва да минавам през временен файл :-(
аз дори пробвах
tplprocess < $1 > $1
ама тва изобщо не работи :-)
сега проблемите ми станаха с 1 повече :-))
аз дори пробвах
tplprocess < $1 > $1
ама тва изобщо не работи :-)
сега проблемите ми станаха с 1 повече :-))
Re: find/xargs проблемче
Ето ти решение, което ще работи ако в директорията няма много файлове:
Не копира два пъти, не използва временни файлове. Само дето няма да работи ако резултата от "find . -type f" е много дълъг. Ако имаш много файлове можеш да го пренапишеш да прави същите неща в -exec на find, но ще е по-бавно.
cd template
for i in `find . -type d` ; do
mkdir -p $DESTINATION/$i
done
for i in `find . -type f` ; do
cat $i | tplprocess > $DESTINATION/$i
done
Не копира два пъти, не използва временни файлове. Само дето няма да работи ако резултата от "find . -type f" е много дълъг. Ако имаш много файлове можеш да го пренапишеш да прави същите неща в -exec на find, но ще е по-бавно.