假设我在特定目录中有以下文件。
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。?有没有解决方法呢?请帮忙
答案 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