ファイルの元の名前から文字の最初の2つのインスタンス間の部分に基づいてファイル名を変更します。

ファイルの元の名前から文字の最初の2つのインスタンス間の部分に基づいてファイル名を変更します。

最初の2つの「|」インスタンス間の文字列に基づいてファイル名を変更しようとしています。私の質問は次のとおりです。

>1234 |利子1|ランダムな数字1.txt

>5678 |利子2|randomstuff2.txt

>9101112 |興味3|randomstuff3|トリッキーなもの。txt

私が望む出力は次のとおりです。

興味1.txt

Interest2.txt

興味3.txt

正規表現と変数を使用してbashでいくつかの操作を試しましたが、目的の結果を得ることはできません。

とても感謝しています!

答え1

Perlベースのrenameユーティリティを使用して、名前がパターンと一致するすべてのファイルの名前を変更します*interest*.txt。パイプシンボルの元の名前を分割し、最後に2番目の結果フィールドを追加して.txt各ファイルの名前を変更します。

rename -n -v '$_ = (split /\|/)[1] . ".txt"' *interest*.txt

-nコマンドが正しい新しい名前を出力することを確認した後、オプションを削除します。

質問に与えられた名前についてテストします。

$ ls -1
>1234|interest1|randomstuff1.txt
>5678|interest2|randomstuff2.txt
>9101112|interest3|randomstuff3|trickything.txt
$ rename -v '$_ = (split /\|/)[1] . ".txt"' *interest*.txt
>1234|interest1|randomstuff1.txt renamed as interest1.txt
>5678|interest2|randomstuff2.txt renamed as interest2.txt
>9101112|interest3|randomstuff3|trickything.txt renamed as interest3.txt
$ ls -1
interest1.txt
interest2.txt
interest3.txt

答え2

|スクリプトは、少なくとも2つの文字を含み、で終わるすべてのファイル名を処理すると仮定します.txt。質問のサンプルファイル名も一致します*interest*.txt。要件が異なる場合は、質問でこれを明確にしてください。

出力が期待したものと同じ場合は、echo前のmv内容を削除して実際にファイル名を変更してください。注釈は# ...コードを説明するためのものなので省略可能です。

for f in *\|*\|*.txt
do
    n="${f#*|}"  # remove leading shortest string matching *|
    n="${n%%|*}" # remove trailing longest string matching |*
    echo mv "$f" "$n".txt
done

答え3

>私は私たちが始めて、(少なくとも)2つの区切り文字(|)を含み、次に終わるファイルに興味があると仮定します.txt

はい

# Preparation
touch '>1234|interest1|randomstuff1.txt' '>5678|interest2|randomstuff2.txt' '>9101112|interest3|randomstuff3|trickything.txt'

# Process
for f in '>'*'|'*'|'*.txt
do
    x="${f#*|}"                      # Remove from start until first found '|'
    x="${x%%|*}.txt"                 # Remove from first found `|` to end

    printf "%s -> %s\n" "$f" "$x"    # Show what would happen
    # mv -f "$f" "$x"                # Do it (if uncommented)
done

出力(なしmv

>1234|interest1|randomstuff1.txt -> interest1.txt
>5678|interest2|randomstuff2.txt -> interest2.txt
>9101112|interest3|randomstuff3|trickything.txt -> interest3.txt

mvファイルを移動するコマンドのコメントを外します。重複した宛先名がある場合は、最後に処理された宛先名が保持されます。

答え4

perl-rename(複数のシステムで呼び出された)場合は、rename次のことができます。

$ rename -n 's/.*?\|(.+?)\|.*/$1.txt/' *txt 
>1234|interest1|randomstuff1.txt -> interest1.txt
>5678|interest2|randomstuff2.txt -> interest2.txt
>9101112|interest3|randomstuff3|trickything.txt -> interest3.txt

出力が必要に-n応じて表示されたら、実際にファイル名を変更せずにコマンドを再実行してください。

関連情報