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

时间:2014-08-02 03:55:00

标签: linux shell unix ksh

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

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
将读取所有文件名rite。?有没有解决方法呢?请帮忙

3 个答案:

答案 0 :(得分:2)

我猜你的意思是所有匹配*h*.csv的文件,在这种情况下你可能想要使用这样的for循环:

for i in *h*.csv; do 
    while read line; do 
        # do some stuff, e.g. 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

答案 1 :(得分:1)

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

另一种强大的模式是:

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

也就是说,find找到具有该模式的所有文件并将其打印出来,while一次读取stdin一行,进入f,并处理它。

答案 2 :(得分:0)

简单的答案是,

dir=$1 <or hardcoded path>
for filename in `find $dir -name "*h*.csv"`
do

echo $filename
#job you want to do further

done