ファイル名の先頭と末尾から文字パターンを削除する

ファイル名の先頭と末尾から文字パターンを削除する

名前を変更したいファイルがたくさんあります。ファイル名は特定の形式に従います。

p1.uniquenameA#blah_a
p2.uniquenameB#blah_b
p3.uniquenameC#blah_c
p4.uniquenameD#blah_d
p5.uniquenameE#blah_e
p6.uniquenameF#blah_f
p7.uniquenameG#blah_g
p8.uniquenameH#blah_h
p9.uniquenameI#blah_i
p10.uniquenameJ#blah_j

各固有のファイル名の前にはプレフィックスが付いています。この場合、プレフィックスは文字で始まり、その後に1ずつ増加するp数字が続きます。pピリオド(.)はプレフィックスと一意のファイル名を区別します。各固有ファイル名の後には、ハッシュタグ()で#始まるサフィックスが続きます。ピリオド(ピリオドを含む)で始まる接頭辞を削除し、ハッシュタグ(ハッシュタグを含む)で始まるサフィックスも削除したいと思います。生成されたファイル名は、ピリオドとハッシュタグの間の一意のファイル名であることを望みます。

uniquenameA
uniquenameB
uniquenameC
uniquenameD
uniquenameE
uniquenameF
uniquenameG
uniquenameH
uniquenameI
uniquenameJ

私はスクリプトが初めてなので、コードを提供するだけでなく、コードがどのように機能するかを説明していただきありがとうございます。

答え1

perlバージョンrenameがある場合がある場合はprename正規表現置換を適用できます。

rename -n 's/^.*?\.(.*?)#.*/$1/' *

正規表現(RE)がわからない場合は学ぶ価値があります。

  • s/xx/yy/- 使用。 。 。xx交換yy
  • ^- 行の暗黙的な開始と一致します。
  • .*?- できるだけ短い文字列と一致0個以上の文字残りのパターンマッチングが適用されます。
  • \.- テキストポイントの一致..文字は何もない、しかし\.文字通りのポイントです)
  • (...)角かっこ内のパターンと一致し、後で引用される一致番号1..9を割り当てます$1(2番目の(...は等に)なります$2)。
  • #- テキスト文字
  • .*- 最長のゲームは0個以上の文字.これは何もない*前のエントリは_zero以上を意味します)

-n満足のいくものを削除してください(「アクションなし」)。会議働く-v実際に何が起こるかを見るには、交換するか、自動操作のために無視してください。

答え2

awkタスクを実行するスクリプトは次のとおりです。

印刷/デバッグのみ:

awk 'match($0,/(^[^\\.]+.)([^#]+)/,m){print "mv "$0" "m[2] }' input.txt    

名前を変更するには:

awk 'match($0,/(^[^\\.]+.)([^#]+)/,m){system("mv "$0" "m[2])}' input.txt    

入力.txt

p1.uniquenameA#blah_a
p2.uniquenameB#blah_b
p3.uniquenameC#blah_c
p4.uniquenameD#blah_d
p5.uniquenameE#blah_e
p6.uniquenameF#blah_f
p7.uniquenameG#blah_g
p8.uniquenameH#blah_h
p9.uniquenameI#blah_i
p10.uniquenameJ#blah_j

出力

mv p1.uniquenameA#blah_a uniquenameA
mv p2.uniquenameB#blah_b uniquenameB
mv p3.uniquenameC#blah_c uniquenameC
mv p4.uniquenameD#blah_d uniquenameD
mv p5.uniquenameE#blah_e uniquenameE
mv p6.uniquenameF#blah_f uniquenameF
mv p7.uniquenameG#blah_g uniquenameG
mv p8.uniquenameH#blah_h uniquenameH
mv p9.uniquenameI#blah_i uniquenameI
mv p10.uniquenameJ#blah_j uniquenameJ

答え3

以下は、以下を使用するソリューションです。sed

for i in *
do
    mv $i $( echo $i | sed 's/p[[:digit:]]*\.\([^#]*\)\#.*/\1/' )
done

ターゲットは、数字の後にピリオドが続くsedものを見つけて作成されます。pこの期間の始めから、この役割の役割は#次のとおりです。覚えるレジスタに入ると、ファイル名全体が次に置き換えられます。覚える数値。

関連情報