![ファイル名の先頭と末尾の文字パターンを削除します](https://rvso.com/image/154481/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%AE%E5%85%88%E9%A0%AD%E3%81%A8%E6%9C%AB%E5%B0%BE%E3%81%AE%E6%96%87%E5%AD%97%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%E5%89%8A%E9%99%A4%E3%81%97%E3%81%BE%E3%81%99.png)
名前を変更したいファイルがたくさんあります。ファイル名は特定の形式になっています:
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文字以上の任意の文字(.
は何でも(*
前項の0以上を意味する)
-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
。ピリオドから文字までの文字#
は思い出したレジスタに入力され、ファイル名全体が思い出した文字。