假设我在一个特定的目录中有以下文件。
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