可以使用ls列出符合模式的文件吗?

4
我想使用ls列出目录中与模式匹配的文件,而不使用grep。这可行吗?
关键是要检索所有与此模式匹配的文件'^\Extra_text_[0-9]\{10\}.csv'并计算它们的数量。
我尝试了以下代码: ls | grep '^\Extra_text_[0-9]\{10\}.csv' InputName=' | grep ^\Extra_text_[0-9]\{10\}.csv' fileCount=`ls $INPUT_FILE/$InputName 2>/dev/null | wc -l` echo "$fileCount 但它没有起作用! :/

“ls”本来就不应该被用于编程;它仅仅是为了生成人类可读的输出而设计的--请参见ParsingLs - Charles Duffy
话虽如此,为什么不能从变量中使用管道组件(或其他shell语法),这在[BashFAQ#50](http://mywiki.wooledge.org/BashFAQ/050)中有详细解释。 - Charles Duffy
你能不能不使用shell文件名通配符?https://www.tldp.org/LDP/abs/html/globbingref.html - Brian Agnew
作为对比,files=( Extra_text_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].csv ); echo "Found ${#files[@]}" 不需要任何外部工具。 - Charles Duffy
1
@BrianAgnew,请不要链接ABS。从它的例子中学到坏习惯的人比几乎任何其他地方都多。Wooledge wikibash-hackers' wiki远远更好的来源。 - Charles Duffy
显示剩余3条评论
2个回答

4
不仅仅使用lsls完全不知道有关模式的信息。它只能与shell提供的globbing(通配符*?或扩展globbing - 请参阅Bash手册页中的extglob)一起使用,但不能与正则表达式一起使用。
使用find是一个简单的方法来完成这个任务(注意,正则表达式需要匹配整个文件名):
find . -regex '<yourpattern>'

为了计算结果,可以使用管道符号将内容传递给wc命令:

# safe for corner case: version of find w/o newline escaping and files with newlines:
find . -regex '<yourpattern>' -printf '.' | wc -c    

# fallback for non-GNU platform, corner cases not addressed:
find . -regex '<yourpattern>' | wc -l 

请查阅 find 手册页中的 -regex 部分以获取更多信息。


如果在GNU平台上,可以使用find ... -printf '\n' | wc -l命令,从输出中删除文件名本身,这样即使正在使用的find版本没有在默认打印操作中执行任何转义,也不会多次计算含有换行符的文件名。 - Charles Duffy
@CharlesDuffy 谢谢。有趣的是,-printf '.' | wc -c 似乎更快:https://dev59.com/OWUo5IYBdhLWcg3w7TCT#15663760 - Michael Jaros
1
顺便说一句,我甚至不会说ls理解shell模式;这是在ls开始之前由shell进行扩展。 - Charles Duffy

1

您可以使用文件匹配元字符。

* matches any number of characters
? matches any one character
[...] matches any one of the characters between the brackets 
which can include a hyphen-separated range of letters or numbers

在此输入图像描述 以上只是一个示例,可能并不完全符合您的需求。因为我无法理解您的正则表达式的含义。

ls -l  Extra_text_[0-9]{10}.csv | wc -l

您可以使用上述命令来计算您获取了多少个文件。

参考资料

Negus, C. (2020) Linux圣经,第10版。Wiley


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接