여러 .txt 파일의 이름을 추가하고 연결된 대상 파일의 이름을 바꿉니다.

여러 .txt 파일의 이름을 추가하고 연결된 대상 파일의 이름을 바꿉니다.

저는 bash 쉘 스크립팅을 처음 접했기 때문에 이 질문을 이미 받았다면 사과드립니다.

여러 파일의 조합이 있습니다. 예를 들면 다음과 같습니다.

USA.txt Florida.txt Miami.txt

이 파일들을 결합하여 모든 내용이 포함된 새 파일을 만들고 싶습니다. 예를 들면 다음과 같습니다.

cat *.txt > USA_FLORIDA_MIAMI.txt

또 다른 경우에는 파일에 다른 접두사가 붙는 경우가 있습니다.

Canada.txt Quebec.txt Montreal.txt

따라서 두 번째 경우의 출력은 CANADA_QUEBEC_MONTREAL.txt가 됩니다.

cat *.txt > CANADA_QUEBEC_MONTREAL.txt

다른 파일의 모든 조합에 대해서도 마찬가지입니다.

첫 번째 경우에는 USA.txt Florida.txt Miami.txt가 디렉터리에 있는 유일한 .txt 파일입니다. 두 번째 경우에는 Canada.txt Quebec.txt Montréal.txt로 대체되기 때문에 해당 시점 디렉터리에 존재하는 모든 .txt 파일의 접두사 정보를 항상 결합하여 추가하는 코드를 작성해야 합니다. 출력 파일의 접두사에 추가됩니다. 여기서 변수는 국가, 주, 도시 이름입니다.

사용할 수 있는 명령에 대한 제안 사항이 있나요? 감사해요

답변1

몇 개만 사용해도 좋을 것 같아요Bash의 매개변수 확장문법.

기본 상황은 다음과 같습니다.

# Use a '_' as IFS value to concatenate arguments while expanding them
IFS=_
# Expand all arguments as "$*", removing their suffix if it matches ".txt" 
names="${*%.txt}"
# Provide all arguments as "$@" to a `cat`, redirected to
# a file named as the concatenated names made uppercase
cat "${@?}" > "${names^^?}.txt"
# The ${@?} syntax prints an error if you don't provide arguments

다음과 같은 한 줄의 코드로 사용할 수 있습니다.

bash -c 'IFS=_ names="${*%.txt}"; cat "${@?}" "${names^^?}.txt"' joiner USA.txt Florida.txt Miami.txt

또는 다음과 같은 기능을 만드세요.

joiner () {
    local IFS=_
    names="${*%.txt}"
    cat "${@?}" > "${names^^?}.txt"
}

스크립트에 포함하거나 source대화형 셸에서 편집하고 다음과 같이 사용하세요.

joiner USA.txt Florida.txt Miami.txt

답변2

더럽지만 효과적이다:

#!/bin/bash

files="$@"
new_file=()
function join_by { local IFS="$1"; shift; echo "$*"; }


for file in $files; do
    prefix=$(echo $file | awk -F'.' '{print $1}')
    new_file+=( $prefix )
    cat $file >> temp_file.txt
done

new_name=$(join_by _ "${new_file[@]}")

mv temp_file.txt $new_name.txt

실행해

bash script_name.sh file.txt file2.txt file3.txt ...

파일을 병합하고 주어진 파일을 기반으로 파일 이름을 생성합니다.

관련 정보