如何从单个 bash 脚本正确调用多个 cat 命令?

如何从单个 bash 脚本正确调用多个 cat 命令?

我正在尝试从多个子目录收集文本文件并将它们连接到每个子目录的单个文件中。可能有一种更好的方法来做到这一点,但我的问题是,如何从 bash 脚本调用多个 cat 命令?这是一个例子:

#!/bin/bash
cat "./directory_1/"*.txt > "directory_1.txt"
cat "./directory_2/"*.txt > "directory_2.txt"

如果我将所有命令保留在同一行,并用分号分隔,它就可以工作。例如:

#!/bin/bash
cat "./directory_1/"*.txt > "directory_1.txt";cat "./directory_2/"*.txt > "directory_2.txt"

但如果我需要调用 20 个目录,脚本就会变得非常难以阅读。

我期望第一个示例运行每个 cat 命令,但是,抛出了以下错误:

line 2: $'\r': command not found
: No such file or directorydirectory2.txt

看来我的换行符有问题。我正在尝试在 Windows 10 的 Ubuntu shell 上运行此命令。

答案1

以下循环将以您描述的方式处理当前目录下的每个目录:

for dir in */; do
    cat "$dir"/*.txt >"${dir%/}.txt"
done

该东西从循环头中的全局匹配中删除了${dir%/}尾随。/$dir

您收到的错误可能是由于在 Windows 计算机上(使用 Windows 编辑器)编写脚本造成的。 Windows(和DOS)文本文件在每行末尾的换行符之前都有一个回车符,而Unix文本文件只有换行符。您可以使用该实用程序将脚本转换为 Unix 文本文件dos2unix

答案2

在这种情况下,错误消息是准确的。该脚本以 Windows 风格的行结尾“CR/LF”而不是 Unix 风格的“LF”保存。更新 bash 文件的行结尾解决了该问题。

相关内容