【问题标题】:Read all files line by line in a directory and do a command on them逐行读取目录中的所有文件并对它们执行命令
【发布时间】:2013-08-21 14:02:41
【问题描述】:

我正在尝试制作一个脚本,允许我在对这些文件的特定列执行命令时逐行读取目录中的所有文件。我正在处理的文件是 .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

有任何提示、建议或示例吗?

谢谢大家

更新

我还希望最终复制所有文件以包含您在第一个 if 语句中看到的命令,所以我想 a.) 将我的文件分开 b.) 创建一个包含更新的副本价值。

【问题讨论】:

  • google for find -type f -execdir cmd {} \;

标签: bash shell scripting directory


【解决方案1】:

如果要将文件名保存在变量中,请使用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

【讨论】:

  • 我喜欢你在第一个示例中的位置,它看起来应该可以工作,但是当我实际运行脚本时,它会将我带到下一行输入文本,就好像我没有要求一样一份文件。我不想连接文件,因为我们想在某个地方制作文件副本,保持所有文件分开。知道为什么它不读取文件并要求文本吗?
  • @Beardy cat 不会修改文件,它只是将它们一个接一个地打印到标准输出。
  • 对,但如果我想将 file1.txt 等文件复制到 file1-copy.txt,那么我可能不想使用 cat。我想基本上阅读所有文件,但要一个一个地阅读,使用我将在特定列上运行的更新命令复制它的内容。该副本将包含更新。这有意义吗?
猜你喜欢
  • 2012-05-18
  • 2013-02-22
  • 2012-09-14
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
相关资源
最近更新 更多