最初の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
応じて表示されたら、実際にファイル名を変更せずにコマンドを再実行してください。