複数の .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

おすすめ記事