[pacman-dev] makepkg enhancements: globstar and variable expansions in PURGE_TARGETS, MAN_DIRS, etc.
Hy everybody! While building some custom packages for a stripped down Linux server, I've hit the following problems: * the cause of the problems is from the pact that my packages are each in it's own folder like: /packages/bash--4.0--1, /packages/busybox--1.15.2--1, etc., and thus, * MAN_DIRS, DOC_DIRS, STRIP_DIRS and PRUNE_TARGETS doesn't work, as I have no way to use ${pkgname}, etc in there; * in PRUNE_TARGETS there is no way to specify file patterns (like '*.a', or '*.la'), but only from certain folders; (for example I can say '*.a', but not '../lib/*.a'; also I can not specify unknown number of parents, like '.../lib/**/*.a'; As a consequence, I propose (and if accepted I also have the patches for) the following enhancements: * allow the patterns in MAN_DIRS, etc. to be evaluated at the proper time execution time (when we access MAN_DIRS), not at configuration time (when we define MAN_DIRS); this can be achieved by (single) quoting the patterns like: 'package/${pkgname}--${pkgver}--${pkgrel}/{,share/}man' and then expansion by using eval; * allow enhanced pattern types for PURGE_TARGETS, like: * the same lazy evaluation as above; * if a pattern starts with '=' then it must exactly match a file name; * if a pattern starts with '+' then it is a glob pattern (or globstar), like: 'packages/${pkgname}--${pkgver}--${pkgrel}/lib/**/*.a' * if a pattern ends with '/' then we use `rm -Rf`, else we use `rm -f` * maybe if a pattern starts with '@' then it is a regular expression, etc. (this I have not implemented); Any comments? Also one more question: just before packaging we remove the pkg folder. Shouldn't we also do the same with src when rebuilding a package? (We are re-extracting the contents of archives, but some packages leave garbage behind when building, and this garbage could interfere with a new build...) Thanks, Ciprian.
Ciprian Dorin, Craciun wrote:
Hy everybody!
While building some custom packages for a stripped down Linux server, I've hit the following problems: * the cause of the problems is from the pact that my packages are each in it's own folder like: /packages/bash--4.0--1, /packages/busybox--1.15.2--1, etc., and thus, * MAN_DIRS, DOC_DIRS, STRIP_DIRS and PRUNE_TARGETS doesn't work, as I have no way to use ${pkgname}, etc in there; * in PRUNE_TARGETS there is no way to specify file patterns (like '*.a', or '*.la'), but only from certain folders; (for example I can say '*.a', but not '../lib/*.a'; also I can not specify unknown number of parents, like '.../lib/**/*.a';
As a consequence, I propose (and if accepted I also have the patches for) the following enhancements: * allow the patterns in MAN_DIRS, etc. to be evaluated at the proper time execution time (when we access MAN_DIRS), not at configuration time (when we define MAN_DIRS); this can be achieved by (single) quoting the patterns like: 'package/${pkgname}--${pkgver}--${pkgrel}/{,share/}man' and then expansion by using eval;
You can use MAN_DIRS=({package/*/,}{usr{,/local}{,/share},opt/*}/{man,info}) and that will work. An eval statement is evil.
* allow enhanced pattern types for PURGE_TARGETS, like: * the same lazy evaluation as above; * if a pattern starts with '=' then it must exactly match a file name; * if a pattern starts with '+' then it is a glob pattern (or globstar), like: 'packages/${pkgname}--${pkgver}--${pkgrel}/lib/**/*.a'
These seem to be able to be handled in much the same way as MAN_DIRS above.
* if a pattern ends with '/' then we use `rm -Rf`, else we use `rm -f`
Instead of ending in /, end it in /* and combine with !emptydirs?
* maybe if a pattern starts with '@' then it is a regular expression, etc. (this I have not implemented);
Any comments?
This all sounds overcomplicated. Before considering this further, I would like to see an example that can not be handled by the current setup. Allan
On Sat, Nov 14, 2009 at 8:44 AM, Allan McRae <allan@archlinux.org> wrote:
Ciprian Dorin, Craciun wrote:
Hy everybody!
While building some custom packages for a stripped down Linux server, I've hit the following problems: * the cause of the problems is from the pact that my packages are each in it's own folder like: /packages/bash--4.0--1, /packages/busybox--1.15.2--1, etc., and thus, * MAN_DIRS, DOC_DIRS, STRIP_DIRS and PRUNE_TARGETS doesn't work, as I have no way to use ${pkgname}, etc in there; * in PRUNE_TARGETS there is no way to specify file patterns (like '*.a', or '*.la'), but only from certain folders; (for example I can say '*.a', but not '../lib/*.a'; also I can not specify unknown number of parents, like '.../lib/**/*.a';
As a consequence, I propose (and if accepted I also have the patches for) the following enhancements: * allow the patterns in MAN_DIRS, etc. to be evaluated at the proper time execution time (when we access MAN_DIRS), not at configuration time (when we define MAN_DIRS); this can be achieved by (single) quoting the patterns like: 'package/${pkgname}--${pkgver}--${pkgrel}/{,share/}man' and then expansion by using eval;
You can use
MAN_DIRS=({package/*/,}{usr{,/local}{,/share},opt/*}/{man,info})
and that will work. An eval statement is evil.
I don't know this for sure, but I assume that the makepkg.conf file is sourced before actually going to build or package. Thus in order for `package/*/` to work it must already exist in the current folder. For example I've searched makepkg.sh for where the config file is read, and I've found that it's hold in the MAKEPKG_CONF variable. And the only place it's sourced is just before executing anything. This means that (maybe) my previous assumption is right, and that `package/*` or `opt/*` doesn't work. I agree that `eval` is evil. (If you ask me Bash is the most evil programming language from them all, but I still do about 25% of my programming in Bash...) So coming back to eval, in order to make my use-case happen we have two options: * either we source MAKEPKG_CONF before each operation, * or we use eval on our patterns, and we single quote the patterns in the config file;
* allow enhanced pattern types for PURGE_TARGETS, like: * the same lazy evaluation as above; * if a pattern starts with '=' then it must exactly match a file name; * if a pattern starts with '+' then it is a glob pattern (or globstar), like: 'packages/${pkgname}--${pkgver}--${pkgrel}/lib/**/*.a'
These seem to be able to be handled in much the same way as MAN_DIRS above.
No it is not. For example if I have usr/lib/something/libsomething.a, I cannot purge libsomething.a unless I explicitly say `*.a` (which could erase even other files in other folders), or `usr/lib/*/*.a`, which forces me to know that I have folders. (Thus eliminating the generality of makepkg.conf.) But again, it doesn't work, as explained above, because usr/lib/*/*.a should already exist at source time in order to work.
* if a pattern ends with '/' then we use `rm -Rf`, else we use `rm -f`
Instead of ending in /, end it in /* and combine with !emptydirs?
Again it doesn't work. If a folder contain subfolders it shall eliminate only the files in the parent, but not files in children. Also emptyfolders is a packaging option, and purging should be able to remove a folder completely without leanig on the emptyfolders support. (For example there could be cases where a package should contain an empty folder.)
* maybe if a pattern starts with '@' then it is a regular expression, etc. (this I have not implemented);
Any comments?
This all sounds overcomplicated. Before considering this further, I would like to see an example that can not be handled by the current setup.
Allan
I hope that my examples are enough to show that there is a imitation in current *_DIRS and PURGE_TARGETS. If I'm wrong about the conf file sourcing please correct me, but from what I've seen I think I'm right. Thanks, Ciprian.
On Sat, Nov 14, 2009 at 10:02 AM, Ciprian Dorin, Craciun <ciprian.craciun@gmail.com> wrote:
On Sat, Nov 14, 2009 at 8:44 AM, Allan McRae <allan@archlinux.org> wrote:
Ciprian Dorin, Craciun wrote:
Hy everybody!
While building some custom packages for a stripped down Linux server, I've hit the following problems: * the cause of the problems is from the pact that my packages are each in it's own folder like: /packages/bash--4.0--1, /packages/busybox--1.15.2--1, etc., and thus, * MAN_DIRS, DOC_DIRS, STRIP_DIRS and PRUNE_TARGETS doesn't work, as I have no way to use ${pkgname}, etc in there; * in PRUNE_TARGETS there is no way to specify file patterns (like '*.a', or '*.la'), but only from certain folders; (for example I can say '*.a', but not '../lib/*.a'; also I can not specify unknown number of parents, like '.../lib/**/*.a';
As a consequence, I propose (and if accepted I also have the patches for) the following enhancements: * allow the patterns in MAN_DIRS, etc. to be evaluated at the proper time execution time (when we access MAN_DIRS), not at configuration time (when we define MAN_DIRS); this can be achieved by (single) quoting the patterns like: 'package/${pkgname}--${pkgver}--${pkgrel}/{,share/}man' and then expansion by using eval;
You can use
MAN_DIRS=({package/*/,}{usr{,/local}{,/share},opt/*}/{man,info})
and that will work. An eval statement is evil.
I don't know this for sure, but I assume that the makepkg.conf file is sourced before actually going to build or package. Thus in order for `package/*/` to work it must already exist in the current folder.
For example I've searched makepkg.sh for where the config file is read, and I've found that it's hold in the MAKEPKG_CONF variable. And the only place it's sourced is just before executing anything. This means that (maybe) my previous assumption is right, and that `package/*` or `opt/*` doesn't work.
I agree that `eval` is evil. (If you ask me Bash is the most evil programming language from them all, but I still do about 25% of my programming in Bash...) So coming back to eval, in order to make my use-case happen we have two options: * either we source MAKEPKG_CONF before each operation, * or we use eval on our patterns, and we single quote the patterns in the config file;
* allow enhanced pattern types for PURGE_TARGETS, like: * the same lazy evaluation as above; * if a pattern starts with '=' then it must exactly match a file name; * if a pattern starts with '+' then it is a glob pattern (or globstar), like: 'packages/${pkgname}--${pkgver}--${pkgrel}/lib/**/*.a'
These seem to be able to be handled in much the same way as MAN_DIRS above.
No it is not. For example if I have usr/lib/something/libsomething.a, I cannot purge libsomething.a unless I explicitly say `*.a` (which could erase even other files in other folders), or `usr/lib/*/*.a`, which forces me to know that I have folders. (Thus eliminating the generality of makepkg.conf.)
But again, it doesn't work, as explained above, because usr/lib/*/*.a should already exist at source time in order to work.
* if a pattern ends with '/' then we use `rm -Rf`, else we use `rm -f`
Instead of ending in /, end it in /* and combine with !emptydirs?
Again it doesn't work. If a folder contain subfolders it shall eliminate only the files in the parent, but not files in children.
Also emptyfolders is a packaging option, and purging should be able to remove a folder completely without leanig on the emptyfolders support. (For example there could be cases where a package should contain an empty folder.)
* maybe if a pattern starts with '@' then it is a regular expression, etc. (this I have not implemented);
Any comments?
This all sounds overcomplicated. Before considering this further, I would like to see an example that can not be handled by the current setup.
Allan
I hope that my examples are enough to show that there is a imitation in current *_DIRS and PURGE_TARGETS.
If I'm wrong about the conf file sourcing please correct me, but from what I've seen I think I'm right.
Thanks, Ciprian.
One quick note. I've tried what you've suggested (`package/*/...`) and it doesn't work (as expected `*` expands before anything is in the current dir). Ciprian.
Ciprian Dorin, Craciun wrote:
One quick note. I've tried what you've suggested (`package/*/...`) and it doesn't work (as expected `*` expands before anything is in the current dir).
It does not expand it until it actually uses the value in the array. i.e. when it goes to do the man page compression/purging. This is my test PKGBUILD --start PKGBUILD-- pkgname=('t1') pkgdesc="text with spaces" pkgver=1 pkgrel=1 arch=('i686' 'x86_64') license=('testing the license') depends=('pacman') build () { return 0 } package() { mkdir -p ${pkgdir}/package/foobar-2.1/usr/share/man/man1 echo "I am a man page" > ${pkgdir}/package/foobar-2.1/usr/share/man/man1/test.1 } --end PKGBUILD-- I get that "man page" compressed with MAN_DIRS=({package/*,}{usr{,/local}{,/share},opt/*}/{man,info})
On Sat, Nov 14, 2009 at 12:40 PM, Allan McRae <allan@archlinux.org> wrote:
Ciprian Dorin, Craciun wrote:
One quick note. I've tried what you've suggested (`package/*/...`) and it doesn't work (as expected `*` expands before anything is in the current dir).
It does not expand it until it actually uses the value in the array. i.e. when it goes to do the man page compression/purging.
This is my test PKGBUILD
--start PKGBUILD--
pkgname=('t1') pkgdesc="text with spaces" pkgver=1 pkgrel=1 arch=('i686' 'x86_64') license=('testing the license') depends=('pacman')
build () { return 0 }
package() { mkdir -p ${pkgdir}/package/foobar-2.1/usr/share/man/man1 echo "I am a man page" > ${pkgdir}/package/foobar-2.1/usr/share/man/man1/test.1 }
--end PKGBUILD--
I get that "man page" compressed with
MAN_DIRS=({package/*,}{usr{,/local}{,/share},opt/*}/{man,info})
Sorry, didn't work for me. I've updated the /etc/makepkg.conf, to also include your `{package/*,}{usr{,/local}{,/share},opt/*}/{man,info}`, and also checked that I have zipman in OPTIONS. I've also updated /usr/bin/makepkg to start with bash -x (display all commands), and this is what I have: ~~~~ -> Compressing man and info pages... ++> local manpage ext file link hardlinks hl ++> read manpage ++> find usr/man usr/info usr/share/man usr/share/info usr/local/man usr/local/info usr/local/share/man usr/local/share/info 'opt/*/man' 'opt/*/info' 'package/*usr/man' 'package/*usr/info' 'package/*usr/share/man' 'package/*usr/share/info' 'package/*usr/local/man' 'package/*usr/local/info' 'package/*usr/local/share/man' 'package/*usr/local/share/info' 'package/*opt/*/man' 'package/*opt/*/info' usr/man usr/info usr/share/man usr/share/info usr/local/man usr/local/info usr/local/share/man usr/local/share/info 'opt/*/man' 'opt/*/info' -type f ~~~~ You can clearly see that find receives as arguments paths that contain a *, and that these paths are quoted. Ciprian. P.S.: The makepkg is the one from the ArchLinux distribution, and not the one I've patched.
Ciprian Dorin, Craciun wrote:
On Sat, Nov 14, 2009 at 12:40 PM, Allan McRae <allan@archlinux.org> wrote:
Ciprian Dorin, Craciun wrote:
One quick note. I've tried what you've suggested (`package/*/...`) and it doesn't work (as expected `*` expands before anything is in the current dir).
It does not expand it until it actually uses the value in the array. i.e. when it goes to do the man page compression/purging.
This is my test PKGBUILD
--start PKGBUILD--
pkgname=('t1') pkgdesc="text with spaces" pkgver=1 pkgrel=1 arch=('i686' 'x86_64') license=('testing the license') depends=('pacman')
build () { return 0 }
package() { mkdir -p ${pkgdir}/package/foobar-2.1/usr/share/man/man1 echo "I am a man page" > ${pkgdir}/package/foobar-2.1/usr/share/man/man1/test.1 }
--end PKGBUILD--
I get that "man page" compressed with
MAN_DIRS=({package/*,}{usr{,/local}{,/share},opt/*}/{man,info})
Sorry, didn't work for me. I've updated the /etc/makepkg.conf, to also include your `{package/*,}{usr{,/local}{,/share},opt/*}/{man,info}`, and also checked that I have zipman in OPTIONS.
I've also updated /usr/bin/makepkg to start with bash -x (display all commands), and this is what I have:
~~~~ -> Compressing man and info pages... ++> local manpage ext file link hardlinks hl ++> read manpage ++> find usr/man usr/info usr/share/man usr/share/info usr/local/man usr/local/info usr/local/share/man usr/local/share/info 'opt/*/man' 'opt/*/info' 'package/*usr/man' 'package/*usr/info' 'package/*usr/share/man' 'package/*usr/share/info' 'package/*usr/local/man' 'package/*usr/local/info' 'package/*usr/local/share/man' 'package/*usr/local/share/info' 'package/*opt/*/man' 'package/*opt/*/info' usr/man usr/info usr/share/man usr/share/info usr/local/man usr/local/info usr/local/share/man usr/local/share/info 'opt/*/man' 'opt/*/info' -type f ~~~~
You can clearly see that find receives as arguments paths that contain a *, and that these paths are quoted.
Ciprian.
P.S.: The makepkg is the one from the ArchLinux distribution, and not the one I've patched.
From the output it should have been fairly obvious I screwed up the MAN_DIRS line... MAN_DIRS=({package/*/,}{usr{,/local}{,/share},opt/*}/{man,info}) Not the extra "/" Allan
On Sat, Nov 14, 2009 at 2:15 PM, Allan McRae <allan@archlinux.org> wrote:
Ciprian Dorin, Craciun wrote:
On Sat, Nov 14, 2009 at 12:40 PM, Allan McRae <allan@archlinux.org> wrote:
Ciprian Dorin, Craciun wrote:
One quick note. I've tried what you've suggested (`package/*/...`) and it doesn't work (as expected `*` expands before anything is in the current dir).
It does not expand it until it actually uses the value in the array. i.e. when it goes to do the man page compression/purging.
This is my test PKGBUILD
--start PKGBUILD--
pkgname=('t1') pkgdesc="text with spaces" pkgver=1 pkgrel=1 arch=('i686' 'x86_64') license=('testing the license') depends=('pacman')
build () { return 0 }
package() { mkdir -p ${pkgdir}/package/foobar-2.1/usr/share/man/man1 echo "I am a man page" > ${pkgdir}/package/foobar-2.1/usr/share/man/man1/test.1 }
--end PKGBUILD--
I get that "man page" compressed with
MAN_DIRS=({package/*,}{usr{,/local}{,/share},opt/*}/{man,info})
Sorry, didn't work for me. I've updated the /etc/makepkg.conf, to also include your `{package/*,}{usr{,/local}{,/share},opt/*}/{man,info}`, and also checked that I have zipman in OPTIONS.
I've also updated /usr/bin/makepkg to start with bash -x (display all commands), and this is what I have:
~~~~ -> Compressing man and info pages... ++> local manpage ext file link hardlinks hl ++> read manpage ++> find usr/man usr/info usr/share/man usr/share/info usr/local/man usr/local/info usr/local/share/man usr/local/share/info 'opt/*/man' 'opt/*/info' 'package/*usr/man' 'package/*usr/info' 'package/*usr/share/man' 'package/*usr/share/info' 'package/*usr/local/man' 'package/*usr/local/info' 'package/*usr/local/share/man' 'package/*usr/local/share/info' 'package/*opt/*/man' 'package/*opt/*/info' usr/man usr/info usr/share/man usr/share/info usr/local/man usr/local/info usr/local/share/man usr/local/share/info 'opt/*/man' 'opt/*/info' -type f ~~~~
You can clearly see that find receives as arguments paths that contain a *, and that these paths are quoted.
Ciprian.
P.S.: The makepkg is the one from the ArchLinux distribution, and not the one I've patched.
From the output it should have been fairly obvious I screwed up the MAN_DIRS line...
MAN_DIRS=({package/*/,}{usr{,/local}{,/share},opt/*}/{man,info})
Not the extra "/"
Allan
Sorry, indeed it works, but, the find invocation is still odd: ~~~~ ++> printf ' -> Compressing man and info pages...\n' -> Compressing man and info pages... ++> local manpage ext file link hardlinks hl ++> read manpage ++> find usr/man usr/info usr/share/man usr/share/info usr/local/man usr/local/info usr/local/share/man usr/local/share/info 'opt/*/man' 'opt/*/info' 'package/*/usr/man' 'package/*/usr/info' package/foobar-2.1/usr/share/man 'package/*/usr/share/info' 'package/*/usr/local/man' 'package/*/usr/local/info' 'package/*/usr/local/share/man' 'package/*/usr/local/share/info' 'package/*/opt/*/man' 'package/*/opt/*/info' usr/man usr/info usr/share/man usr/share/info usr/local/man usr/local/info usr/local/share/man usr/local/share/info 'opt/*/man' 'opt/*/info' -type f ++> '[' -f package/foobar-2.1/usr/share/man/man1/test.1 ']' ++> ext=1 ++> file=test.1 ++> '[' 1 '!=' gz -a 1 '!=' bz2 ']' ... ~~~~ Ciprian.
Ciprian Dorin, Craciun wrote:
Sorry, indeed it works, but, the find invocation is still odd:
~~~~ ++> printf ' -> Compressing man and info pages...\n' -> Compressing man and info pages... ++> local manpage ext file link hardlinks hl ++> read manpage ++> find usr/man usr/info usr/share/man usr/share/info usr/local/man usr/local/info usr/local/share/man usr/local/share/info 'opt/*/man' 'opt/*/info' 'package/*/usr/man' 'package/*/usr/info' package/foobar-2.1/usr/share/man 'package/*/usr/share/info' 'package/*/usr/local/man' 'package/*/usr/local/info' 'package/*/usr/local/share/man' 'package/*/usr/local/share/info' 'package/*/opt/*/man' 'package/*/opt/*/info' usr/man usr/info usr/share/man usr/share/info usr/local/man usr/local/info usr/local/share/man usr/local/share/info 'opt/*/man' 'opt/*/info' -type f ++> '[' -f package/foobar-2.1/usr/share/man/man1/test.1 ']' ++> ext=1 ++> file=test.1 ++> '[' 1 '!=' gz -a 1 '!=' bz2 ']' ... ~~~~
You are going to have to clarify exactly what you think is odd here.
On Sat, Nov 14, 2009 at 4:39 PM, Allan McRae <allan@archlinux.org> wrote:
Ciprian Dorin, Craciun wrote:
Sorry, indeed it works, but, the find invocation is still odd:
~~~~ ++> printf ' -> Compressing man and info pages...\n' -> Compressing man and info pages... ++> local manpage ext file link hardlinks hl ++> read manpage ++> find usr/man usr/info usr/share/man usr/share/info usr/local/man usr/local/info usr/local/share/man usr/local/share/info 'opt/*/man' 'opt/*/info' 'package/*/usr/man' 'package/*/usr/info' package/foobar-2.1/usr/share/man 'package/*/usr/share/info' 'package/*/usr/local/man' 'package/*/usr/local/info' 'package/*/usr/local/share/man' 'package/*/usr/local/share/info' 'package/*/opt/*/man' 'package/*/opt/*/info' usr/man usr/info usr/share/man usr/share/info usr/local/man usr/local/info usr/local/share/man usr/local/share/info 'opt/*/man' 'opt/*/info' -type f ++> '[' -f package/foobar-2.1/usr/share/man/man1/test.1 ']' ++> ext=1 ++> file=test.1 ++> '[' 1 '!=' gz -a 1 '!=' bz2 ']' ... ~~~~
You are going to have to clarify exactly what you think is odd here.
In the find arguments we can find some that have a '*' in there... They are clearly not valid folder names. (See below. The `...` are cuts from the command line.) find ... \ 'opt/*/man' ... \ 'opt/*/info' 'package/*/usr/man' 'package/*/usr/info' ... \ 'package/*/usr/share/info' ... \ 'package/*/usr/local/man' \ 'package/*/usr/local/info' \ ... Ciprian. P.S.: I'm not insisting on pushing a feature into makepkg. I'm just trying to enhance it. So if this kind of patch is not welcomed, please clearly say so, and I'll stop bugging you. (Of course I'll continue to use it for myself.)
Ciprian Dorin, Craciun wrote:
On Sat, Nov 14, 2009 at 4:39 PM, Allan McRae <allan@archlinux.org> wrote:
Ciprian Dorin, Craciun wrote:
Sorry, indeed it works, but, the find invocation is still odd:
~~~~ ++> printf ' -> Compressing man and info pages...\n' -> Compressing man and info pages... ++> local manpage ext file link hardlinks hl ++> read manpage ++> find usr/man usr/info usr/share/man usr/share/info usr/local/man usr/local/info usr/local/share/man usr/local/share/info 'opt/*/man' 'opt/*/info' 'package/*/usr/man' 'package/*/usr/info' package/foobar-2.1/usr/share/man 'package/*/usr/share/info' 'package/*/usr/local/man' 'package/*/usr/local/info' 'package/*/usr/local/share/man' 'package/*/usr/local/share/info' 'package/*/opt/*/man' 'package/*/opt/*/info' usr/man usr/info usr/share/man usr/share/info usr/local/man usr/local/info usr/local/share/man usr/local/share/info 'opt/*/man' 'opt/*/info' -type f ++> '[' -f package/foobar-2.1/usr/share/man/man1/test.1 ']' ++> ext=1 ++> file=test.1 ++> '[' 1 '!=' gz -a 1 '!=' bz2 ']' ... ~~~~ You are going to have to clarify exactly what you think is odd here.
In the find arguments we can find some that have a '*' in there... They are clearly not valid folder names. (See below. The `...` are cuts from the command line.)
find ... \ 'opt/*/man' ... \ 'opt/*/info' 'package/*/usr/man' 'package/*/usr/info' ... \ 'package/*/usr/share/info' ... \ 'package/*/usr/local/man' \ 'package/*/usr/local/info' \ ...
You are allowed to use wildcards in -name arguements provided the names are quoted. See "man find". Allan
participants (2)
-
Allan McRae
-
Ciprian Dorin, Craciun