Which command returns all files that end with a single digit and have the TXT extension ?
One of the most basic tools for locating files (or other kinds of nodes) is the
find ./ -type f -name '*[!0-9][0-9].txt'
This will search:
- ...recursivly from the current directory (
./). You could change this to another path or even leave it off since this is the default value for most versions of
- ...for items that are files as opposed to directories, devices nodes, symbolic links, etc (
-type f). You could leave this off if you wanted to find other types too.
- ...for items that match the name pattern given. Note that I have used single quotes to encose the pattern so that bash or your shell does not try to expland it to a glob pattern before find even gets the command. The star matches any number of characters, then the end of the file must be something other than a digit, then a digit, then your extention. (
If there are files whose name is only a digit followed by
.txt, the command above will miss them, because it requires one non-digit before the digit. The following equivalent commands use boolean operators to include file names with just a digit as well (
-o is “or” and
! is “not”):
find ./ -type f \( -name '*[!0-9][0-9].txt' -o -name '[0-9].txt' \) find ./ -type f -name '*[0-9].txt' ! -name '*[0-9][0-9].txt'
Note that this will be case sensitive. If you would like an insensitive match, you can use
-iname instead of
-name to match things like
file4.TXT as well. Also be aware that just because a file claims to be a text file with that extention does not mean it is. On linux any file can be any type no matter the name. There might also be text files with other extentions or with no extention at all.
In zsh, with
setopt extended_glob in
print -lr -- *[0-9].txt~*[0-9][0-9].txt
If your file names don't begin with
- and don't contain
\ you can save a bit of typing:
print -l *[0-9].txt~*[0-9][0-9].txt
print -l by
echo to show the names with spaces between them instead of newlines. Replace
print -l by
ls -d to see the file names formatted by
ls (e.g. in color, depending on your aliases), or by just
ls if none of the matches are directories:
If you want to see files in subdirectories as well, add
**/ before the pattern: