複数の .txt ファイルの名前を追加し、リンク先ファイルの名前を変更します。

複数の .txt ファイルの名前を追加し、リンク先ファイルの名前を変更します。

私は初めてbashシェルスクリプトに触れたので、この質問をすでに受け取った場合は謝罪します。

複数のファイルの組み合わせがあります。たとえば、次のようになります。

USA.txt Florida.txt Miami.txt

これらのファイルを組み合わせて、すべての内容を含む新しいファイルを作成したいと思います。たとえば、次のようになります。

cat *.txt > USA_FLORIDA_MIAMI.txt

別のケースでは、ファイルに別のプレフィックスが付くことがあります。

Canada.txt Quebec.txt Montreal.txt

したがって、2番目の場合の出力はCANADA_QUEBEC_MONTREAL.txtになります。

cat *.txt > CANADA_QUEBEC_MONTREAL.txt

他のファイルのすべての組み合わせについても同様です。

最初のケースでは、USA.txt Florida.txt Miami.txtがディレクトリにある唯一の.txtファイルです。 2番目のケースでは、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

次のような1行のコードとして使用できます。

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 ...

ファイルをマージし、指定されたファイルに基づいてファイル名を生成します。

関連情報