2013-08-19 39 views
0

我正在尝试制作一个脚本,该脚本允许我在对这些文件的特定列执行命令的同时逐行读取目录中的所有文件。我正在处理的文件是具有用逗号分隔的值的.txt文件。我可以通过将文本文件输入到脚本,然后输出值而不是多个文件来执行单个文件的代码,这是我的目标。我希望文件按目录中的顺序读取。这是我到目前为止。在一个目录中逐行读取所有文件,并在它们上执行一条命令

directory=$(/dos2unix/*.txt) 
file=$(*.txt") 
IFS="," 
for "$file" in "$directory"; 
do 
    while read -ra line; 
    do 
      if [ "${line[1]}" != "" ]; then 
       echo -n "${line[*]}, Hash Value:"; echo "${line[1]}" | openssl dgst -sha1 | sed 's/^.* //' 
      else 
       if [ "${line[1]}" == "" ]; then 
        echo "${line[*]}, Hash Value:None"; 
       fi 
      fi 
    done 
done 

一些我收到的错误是:

$ ./orange2.sh 
/dos2unix/test1.txt: line 1: hello: command not found 
/dos2unix/test1.txt: line 2: goodbye: command not found 
/dos2unix/test1.txt: line 4: last: command not found 
./orange2.sh: line 28: unexpected EOF while looking for matching `"' 
./orange2.sh: line 33: syntax error: unexpected end of file 

任何提示,建议或例子吗?

感谢所有

UPDATE

我也期待复制所有文件的最终包含您在第一次看到if语句,所以我想一个命令。)把我的文件分开和b。)创建一个包含更新值的副本。

+0

为谷歌找到'型的F -execdir CMD {} \;' – hek2mgl

回答

0

如果要将文件名保存在变量中,请使用array=(a b c)语法来创建数组。没有美元符号。然后用for item in "${array[@]}"循环访问数组。

要从文件中读取while read循环,请使用while read; do ...; done < "$file"。这看起来很奇怪,但是整个文件被重定向到循环中。

files=(/dos2unix/*.txt) 

for file in "${files[@]}"; do 
    while IFS=',' read -ra line; do 
     ... 
    done < "$file" 
done 

另一种方法是使用cat所有的文件选项串联在一起,它可以让你摆脱外for循环。

cat /dos2unix/*.txt | while IFS=',' read -ra line; do 
    ... 
done 
+0

我喜欢你在哪里与第一例子去和它看起来像它应该工作,但是当我真正运行脚本,它需要我到下一行输入文本,就好像我没有要求输入文件一样。我不想对文件进行转换,因为我们希望将文件的副本保留为所有文件的分隔。任何想法为什么它不读取文件并要求文本? – Beardy

+0

@Beardy'cat'不会修改这些文件,它只是将它们依次打印到标准输出。 –

+0

对,但如果我想要将file1.txt等文件复制到file1-copy.txt,那么我可能不想使用cat。我想从根本上读取所有文件,但只能一个一个读取,将它的内容与我将在特定列上运行的更新命令一起复制。该副本将包含更新。那有意义吗? – Beardy

相关问题