我的文件夹中有一堆文件,它们都以不同的版本号结尾,例如 1、2、3 等。其中一些有扩展名,有些没有。有什么方法可以使用 ls、find 或 grep 等命令来列出以特定字符(例如“1”)结尾的所有文件,该字符可能以也可能不以扩展名结尾?
例如,在一个目录中,我有以下文件:ver1.txt
、ver1
和file.1
.我想做一些会返回 和 的事情,但不会返回ver1.txt
和,如果这有帮助的话。我尝试过使用类似的东西,但这并没有达到我想要的效果......ver1
file.1
ls *[1.]*
答案1
由于您不可能给出可能存在的每个文件名以及您可能搜索的每个模式的示例,因此我将继续您所拥有的内容:
find . -type f | awk -F / '{print $2}' | grep -v '\.[1-100]$'
考虑到您已给出ver1.txt
、ver1
、 和file.1
作为您要搜索的目录中的文件,上述命令将返回您所需的输出:
ver1.txt
ver1
解释一下每个部分:
find . -type f
返回当前目录中的每个文件
awk -F / '{print $2}'
删除命令./
中出现的每个文件开头的find
grep -v '\.[1-100]$'
返回任何不以.#
where中#
的任何数字结尾的文件1-100
。开关v
发现任何不匹配的行在.#
您给出的示例的情况下,有必要使用\
转义.
并在字符串周围使用单引号。指示$
以该字符串结尾的文件,尽管在您的情况下,没有它它也可以工作。我只包含它以防.
万一文件名中可能有其他位置的文件。
您必须根据您要查找的内容更改参数,但这应该可以帮助您开始。
答案2
纯的find
:
find . -regex '\.[^.]*1\|.*1\.[^.]*'
这将匹配ver1
andver1.txt
和file1.ver1.txt
,但是不是 file1.ver2.txt
。如果你也想匹配:
find . -regex '\.[^.]*1\|.*1\..*'
您必须在搜索目录中运行这些命令,find somepath ...
但这是行不通的,因为正则表达式匹配整个路径。