从两个不同的目录中读取文件

时间:2015-06-30 22:35:34

标签: bash shell

我有以下脚本从两个不同的目录中读取文件。使用第一组文件,我做了一些事情。使用另一个目录中的另一组文件(.txt),我读取每一行。现在一切正常,除了我必须包含引号以使脚本工作的事实。如果我不包含它们,它只会从第一个目录中读取文件。

这就是我运行它的方式

bash move.sh" profile / generate / work / generate_profiles_output / merged_profiles / profiles_ * .avro" "刺/ MP /呼入/间/文件/ * TXT"

#!/bin/bash

AVROFILES=$1
FILES=$2
#reading every avro file
for avrofile in ${AVROFILES}
do

   //do some stuff with the avrofile

   #reading the files 
   for f in  $FILES
   do
       #reading every line in on from the file
       while read line
       do

       done <"$f"

   done
done

2 个答案:

答案 0 :(得分:1)

不要将引用的模式作为参数传递给shell;相反,选择一个非文件分隔符来区分这两组文件。 (在这里,我使用:::,GNU parallel用于类似目的。)

$ bash move.sh profile/generate/work/generate_profiles_output/merged_profiles/profiles_ *.avro ::: prod/mp/incoming/meta/files/*.txt

在您的脚本中,您将扫描参数,将:::之前的所有内容放在一个数组中,然后将所有内容放在第二个数组中。

while (( $# > 0 )); do
    f=$1
    shift
    if [[ $f = ::: ]]; then
        break
    fi
    AVROFILES+=( "$f" )
done

FILES=( "$@" )

for avrofile in "${AVROFILES[@]}"
do

   # do some stuff with the avrofile

   # reading the files 
   for f in  "${FILES[@]}"
   do
       # reading every line in on from the file
       while read line
       do

       done <"$f"

   done
done

答案 1 :(得分:0)

你在做什么可能是最简单的方法。如果没有引号,则会评估星号,并且脚本会获得两个文件名列表。

示例:该脚本列出了所有参数:

$ cat files.sh
#!/usr/bin/env bash

i=0

for arg; do
    let i++
    echo \$$i is $arg
done

$ ./files.sh test-00* test-01*
$1 is test-000.delme
$2 is test-001.delme
$3 is test-002.delme
$4 is test-003.delme
$5 is test-004.delme
<snip>

$ ./files.sh "test-00*" "test-01*"
$1 is test-000.delme test-001.delme test-002.delme test-003.delme test-004.delme test-005.delme test-006.delme test-007.delme test-008.delme test-009.delme
$2 is test-010.delme test-011.delme test-012.delme test-013.delme test-014.delme test-015.delme test-016.delme