我应该使用 ls 来查找以某个字母结尾的文件,但该文件是否有扩展名并不重要。
例如,我希望它执行此操作
> ls test test.txt test.ascii other.txt
> ls [something] test test.txt test.ascii
这样我就可以找到以“t”结尾的文件,但不包括扩展名以 t 结尾的文件
编辑:我应该假设文件名中唯一的句点字符将用于扩展名,并且不会有其他字符
答案1
某事=
|grep -e ".*t\.[^.]*" -e "^[^.]*t$"
答案2
如果您使用的是bash
shell,则可以使用该extglob
选项进行复杂的过滤。例如:
解决方案:
bash$ shopt -s extglob
bash$ ls
other.txt test test.ascii test.txt
bash$ ls *@(t.*|[^.]?[[:alnum:]]t)
test test.ascii test.txt
解释:
PATTERN1(t.*)
匹配任何以“t”结尾并后跟文件扩展名的文件:
bash$ ls *@(t.*)
test.ascii test.txt
PATTERN2([^.]?[[:alnum:]]t)
匹配任何不带点、后跟零个或多个字母数字字符并以“t”结尾的文件。这会匹配没有文件扩展名的文件:
bash$ ls *@([^.]?[[:alnum:]]t)
test
该 glob@(PATTERN1|PATTERN2)
与任一模式仅匹配一次。组合的模式仅过滤掉我们正在寻找的内容。
有关 bash 模式的更多信息,请参阅:http://wiki.bash-hackers.org/syntax/pattern
答案3
假设您需要只有一个点(扩展名)的文件,并且
假设您需要在当前目录(./)上搜索,您可以使用:
$ find . -maxdepth 1 -type f -regex './[^.]*t\(\.[^.]*\)?'
./test.txt
./test.ascii
./test
这可以使用,但将包含目录(如果文件名有换行符,则会失败):
$ printf '%s\n' * | grep -e ".*t\.[^.]*" -e "^[^.]*t$"
test
test.ascii
test.txt
tt
要允许文件名带有换行符,请使用(GNU grep):
$ printf '%s\0' * | grep -ze ".*t\.[^.]*" -e "^[^.]*t$" | xargs -0
test test.ascii test.txt tt