単一の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シェルでこのコマンドを実行しようとしています。

答え1

次のループは、説明された方法で現在のディレクトリの下の各ディレクトリを処理します。

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

これはループヘッダーのグローバル一致から末尾を削除します${dir%/}/$dir

あなたが受けているエラーは、Windowsコンピュータにスクリプトを書く(Windowsエディタを使用)ことによって発生する可能性があります。 Windows(およびDOS)テキストファイルには各行の末尾の改行文字の前にキャリッジリターン文字があり、Unixテキストファイルには改行文字のみがあります。このユーティリティを使用して、スクリプトをUnixテキストファイルに変換できますdos2unix

答え2

この場合、エラーメッセージは正しいです。スクリプトは、Unixスタイルの「LF」ではなく、Windowsスタイルの行末「CR / LF」として保存されます。 Bashファイルの行末を更新すると問題が解決しました。

関連情報