Size: 722
Comment:
|
Size: 1407
Comment: first-line; also expand to include simpler options
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
[[Anchor(faq16)]] == How can I use a logical AND in a shell pattern (glob)? == That can be achieved through the !() extglob operator. You'll need {{{extglob}}} set. It can be checked with: |
<<Anchor(faq16)>> == How can I use a logical AND/OR/NOT in a shell pattern (glob)? == [[glob|"Globs"]] are simple patterns that can be used to match filenames or strings. They're generally not very powerful. If you need more power, there are a few options available. If you want to operate on all the files that match glob A ''or'' glob B, just put them both on the same command line: |
Line 5: | Line 8: |
$ shopt extglob | rm *.bak *.old }}} If you want to use a logical OR in just part of a glob (larger than a single charcter -- for which square-bracketed character classes suffice), in Bash, you can use BraceExpansion: {{{ rm *.{bak,old} }}} If you need something still more general/powerful, in KornShell or [[BASH]] you can use ''extended globs''. In Bash, you'll need the {{{extglob}}} option to be set. It can be checked with: {{{ shopt extglob |
Line 10: | Line 25: |
$ shopt -s extglob | shopt -s extglob |
Line 15: | Line 30: |
$ mv foo!(*.d) foo_thursday.d | mv foo!(*.d) foo_thursday.d |
Line 18: | Line 33: |
For the general case: Delete all files containing Pink_Floyd AND not containing The_Final_Cut: |
A more complex example -- delete all files containing Pink_Floyd AND not containing The_Final_Cut: |
Line 23: | Line 36: |
$ rm !(!(*Pink_Floyd*)|*The_Final_Cut*) | rm !(!(*Pink_Floyd*)|*The_Final_Cut*) |
Line 26: | Line 39: |
By the way: these kind of patterns can be used with KornShell and KornShell93, too. They don't have to be enabled there, but are the default patterns. | By the way: these kind of patterns can be used with the KornShell, too. They don't have to be enabled there, but are the default patterns. For a more thorough explanation of extended globs, see [[glob]]. |
How can I use a logical AND/OR/NOT in a shell pattern (glob)?
"Globs" are simple patterns that can be used to match filenames or strings. They're generally not very powerful. If you need more power, there are a few options available.
If you want to operate on all the files that match glob A or glob B, just put them both on the same command line:
rm *.bak *.old
If you want to use a logical OR in just part of a glob (larger than a single charcter -- for which square-bracketed character classes suffice), in Bash, you can use BraceExpansion:
rm *.{bak,old}
If you need something still more general/powerful, in KornShell or BASH you can use extended globs. In Bash, you'll need the extglob option to be set. It can be checked with:
shopt extglob
and set with:
shopt -s extglob
To warm up, we'll move all files starting with foo AND not ending with .d to directory foo_thursday.d:
mv foo!(*.d) foo_thursday.d
A more complex example -- delete all files containing Pink_Floyd AND not containing The_Final_Cut:
rm !(!(*Pink_Floyd*)|*The_Final_Cut*)
By the way: these kind of patterns can be used with the KornShell, too. They don't have to be enabled there, but are the default patterns.
For a more thorough explanation of extended globs, see glob.