O optymalizacji polecej w bash'u
Potrzebowałem zamienić w plikach java-pkg-2-2 na java-pkg-2
find /var/db/pkg/ -exec perl -pi -e 's@java-pkg-2-2@java-pkg-2@' \;
Zajmuje to jednak trochę czasu (dla każdego pliku jest wywoływany perl).
Dlatego postarałem się o taką konstrukcję (tymczasową) :
# find /var/db/pkg/ | xargs grep java-pkg-2-2
/var/db/pkg/dev-java/rhino-1.5.5-r2/rhino-1.5.5-r2.ebuild:inherit ...
/var/db/pkg/dev-java/antlr-2.7.5-r2/antlr-2.7.5-r2.ebuild:inherit ...
/var/db/pkg/dev-java/servletapi-2.3-r2/servletapi-2.3-r2.ebuild:inherit ...
/var/db/pkg/dev-java/libreadline-java-0.8.0-r1/libreadline-java-0.8.0- ...
/var/db/pkg/dev-java/servletapi-2.4-r2/servletapi-2.4-r2.ebuild:inherit ...
/var/db/pkg/dev-java/bsh-2.0_beta4/bsh-2.0_beta4.ebuild:inherit ...
/var/db/pkg/dev-java/ant-core-1.6.5-r13/ant-core-1.6.5-r13.ebuild:inherit ...
Od razu widać, że nie potrzeba nam zawartości. Pozatym 2 procesy nie będą korzystały z tego pliku jednocześnie, więc możemy korzystać z Mapped I/O (wywołanie systemowe mmap(2)
# find /var/db/pkg/ | xargs grep --mmap java-pkg-2-2 | sed 's@:.*@@g;'
/var/db/pkg/dev-java/rhino-1.5.5-r2/rhino-1.5.5-r2.ebuild
/var/db/pkg/dev-java/antlr-2.7.5-r2/antlr-2.7.5-r2.ebuild
/var/db/pkg/dev-java/servletapi-2.3-r2/servletapi-2.3-r2.ebuild
/var/db/pkg/dev-java/libreadline-java-0.8.0-r1/libreadline-java-0.8.0-r1.ebuild
/var/db/pkg/dev-java/servletapi-2.4-r2/servletapi-2.4-r2.ebuild
/var/db/pkg/dev-java/bsh-2.0_beta4/bsh-2.0_beta4.ebuild
/var/db/pkg/dev-java/ant-core-1.6.5-r13/ant-core-1.6.5-r13.ebuild
I przekazujemy to do perla:
# find /var/db/pkg/ | xargs grep --mmap java-pkg-2-2 | sed 's@:.*@@g;' \
| xargs perl -pi -e 's@java-pkg-2-2@java-pkg-2@'
I nie mamy już czasu zaparzyć kawy... (Pierwsze zajmowało strasznie długo)