如何使用while循环来读取特定模式的文件名

假设我在一个特定的目录中有以下文件。

ABC_TEXT_FILE_365.csv ABC_TEXT_FILE_365_07h32.csv BCD_TEXT_FILE_432.csv BCD_TEXT_FILE_432_08h28.csv FGB_TEXT_FILE_567.csv FGB_TEXT_FILE_567_09h45.csv 

现在我只想读取其中有h * .csv模式的文件,然后执行更多的操作。

但我知道, while read filename
将读取所有的文件名称。 有没有什么解决方法。 请帮忙

我猜你是指所有匹配*h*.csv ,在这种情况下,您可能需要使用for循环,如下所示:

 for i in *h*.csv; do while read line; do # do some stuff, eg echo "$line" done < "$i" done 

如果您有任何匹配模式的目录,您可能还需要添加一个测试来确保循环中的每个项目都是一个文件。 那将是:

 for i in *h*.csv; do if [ -f "$i" ]; then while read line; do echo "$line" done < "$i" fi done 

for循环的一个潜在的问题(也就是说, for f in *h*.csv; do ... for f in 'find ...' for f in *h*.csv; do ...或者for f in 'find ...' ),如果有太多的文件可用,那么这将会使命令行太长了。 这是因为在处理for循环之前, *或者内部find被扩展成一个大的命令行。

另一种可靠的模式是:

 find . -name \*h\*.csv | while read f; do echo process $f; done 

也就是说, find查找所有具有该模式的文件,并将其打印出来, while读取stdin,并将其转换为f ,然后对其进行处理。

简单的答案就是,

 dir=$1 <or hardcoded path> for filename in `find $dir -name "*h*.csv"` do echo $filename #job you want to do further done