使用 ls 查找以字符结尾的文件,忽略扩展名

使用 ls 查找以字符结尾的文件,忽略扩展名

我应该使用 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

如果您使用的是bashshell,则可以使用该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

相关内容