단일 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 파일의 줄 끝을 업데이트하면 문제가 해결되었습니다.

관련 정보