Reputation: 759
Look to those regex
find /tmp/MG/virt-manager-5.0.0/ -maxdepth 1 -type f |grep -v [^a-z]+\.[^a-z]+
/tmp/MG/virt-manager-5.0.0/.mailmap
/tmp/MG/virt-manager-5.0.0/virt-manager
/tmp/MG/virt-manager-5.0.0/DESIGN.md
/tmp/MG/virt-manager-5.0.0/meson.build
/tmp/MG/virt-manager-5.0.0/NEWS.md
/tmp/MG/virt-manager-5.0.0/.gitignore
/tmp/MG/virt-manager-5.0.0/README.md
/tmp/MG/virt-manager-5.0.0/.pylintrc
/tmp/MG/virt-manager-5.0.0/.coveragerc
/tmp/MG/virt-manager-5.0.0/virt-install
/tmp/MG/virt-manager-5.0.0/.packit.yaml
/tmp/MG/virt-manager-5.0.0/COPYING
/tmp/MG/virt-manager-5.0.0/virt-xml
/tmp/MG/virt-manager-5.0.0/virt-manager.spec.in
/tmp/MG/virt-manager-5.0.0/INSTALL.md
/tmp/MG/virt-manager-5.0.0/meson_options.txt
/tmp/MG/virt-manager-5.0.0/virt-manager.spec
/tmp/MG/virt-manager-5.0.0/virt-clone
/tmp/MG/virt-manager-5.0.0/CONTRIBUTING.md
/tmp/MG/virt-manager-5.0.0/setup.cfg
I want to get strings which contain CAPITAL letters, including .md .txt but only if words contain at least one capital letter, to explain better
CONTRIBUTING.MD OK
CONTRIBUTING.txt OK
CONTRIBUTING.TXT OK
Contributing.txt OK (has one capital letter)
hello.TXT OK (contain some capital letters)
contributing.txt NO (only lowercase)
I want to obtain this
find /tmp/MG/virt-manager-5.0.0/ -maxdepth 1 -type f |grep -v REGEXWORKS
/tmp/MG/virt-manager-5.0.0/DESIGN.md
/tmp/MG/virt-manager-5.0.0/NEWS.md
/tmp/MG/virt-manager-5.0.0/README.md
/tmp/MG/virt-manager-5.0.0/COPYING
/tmp/MG/virt-manager-5.0.0/INSTALL.md
/tmp/MG/virt-manager-5.0.0/CONTRIBUTING.md
how to do? Thanks
Upvotes: 1
Views: 91
Reputation: 70977
Before using find
command, with -maxdepth 1
!
Notice: shell could do this by himself!
echo /tmp/MG/virt-manager-5.0.0/*[A-Z]*
/tmp/MG/virt-manager-5.0.0/CONTRIBUTING.md /tmp/MG/virt-manager-5.0.0/COPYING /t
mp/MG/virt-manager-5.0.0/DESIGN.md /tmp/MG/virt-manager-5.0.0/INSTALL.md /tmp/MG
/virt-manager-5.0.0/NEWS.md /tmp/MG/virt-manager-5.0.0/README.md /tmp/MG/virt-ma
nager-5.0.0/virtManager
or
ls -dg /tmp/MG/virt-manager-5.0.0/*[A-Z]*
-rw-r--r-- 1 user 4401 Nov 26 20:53 /tmp/MG/virt-manager-5.0.0/CONTRIBUTING.md
-rw-r--r-- 1 user 18092 Nov 26 20:53 /tmp/MG/virt-manager-5.0.0/COPYING
-rw-r--r-- 1 user 10438 Nov 26 20:53 /tmp/MG/virt-manager-5.0.0/DESIGN.md
-rw-r--r-- 1 user 1108 Nov 26 20:53 /tmp/MG/virt-manager-5.0.0/INSTALL.md
-rw-r--r-- 1 user 30648 Nov 26 20:53 /tmp/MG/virt-manager-5.0.0/NEWS.md
-rw-r--r-- 1 user 1114 Nov 26 20:53 /tmp/MG/virt-manager-5.0.0/README.md
drwxr-xr-x 6 user 4096 Nov 26 20:53 /tmp/MG/virt-manager-5.0.0/virtManager
And you even could directly iterate:
printf '%-20s %-19s %3s %4s %7s\n' File Type Lne Wrd Char;\
for file in /tmp/MG/virt-manager-5.0.0/*[A-Z]*; do
mime=$(file -b --mime-type "$file")
if [[ $mime == text* ]]; then
read lines words chars < <(wc < "$file")
else
lines=0 words=0 chars=0
fi
printf '%-20s %-19s %3d %4d %7d\n' \
"${file##*/}" "$mime" "$lines" "$words" "$chars"
done
File Type Lne Wrd Char
CONTRIBUTING.md text/plain 125 611 4401
COPYING text/plain 339 2968 18092
DESIGN.md text/plain 140 1377 10438
INSTALL.md text/plain 42 150 1108
NEWS.md text/plain 679 4675 30648
README.md text/plain 30 147 1114
virtManager inode/directory 0 0 0
Upvotes: 3
Reputation: 185610
With Perl
and a regex:
find . -type f | perl -F'/' -lane 'print if $F[-1] =~ /[[:upper:]]/'
Upvotes: 2
Reputation: 185610
With awk
and a regex:
find . -type f | awk -F'/' '$NF ~ "[[:upper:]]"'
Upvotes: 2
Reputation: 185610
Simply like this, using a glob
:
$ find . -type f -name '*[[:upper:]]*'
./virt-manager-5.0.0/COPYING
./virt-manager-5.0.0/NEWS.md
./virt-manager-5.0.0/INSTALL.md
./virt-manager-5.0.0/README.md
./virt-manager-5.0.0/CONTRIBUTING.md
./virt-manager-5.0.0/DESIGN.md
The -type f
is to match only files.
If you prefer a regex
:
find . | grep '/[^/]*[[:upper:]]'
that can be better written as:
find . -regextype 'egrep' -regex '.*/[^/]*[[:upper:]][^/]*$'
Note: -type f
isn't combined with -regex
like -name
does to match only filenames.
Upvotes: 3