次のファイルセットがあります
top_axi_256_wrapper_05.02.01.14.00_sample06.tgz
top_axi_128_wrapper_05.02.01.14.00_sample06.tgz
05.02.01.14.00
交換部品を使用したいです05_02_01_14_00
。したがって、最終出力は次のように名前が変更されたファイルです。
top_axi_256_wrapper_05_02_01_14_00_sample06.tgz
top_axi_128_wrapper_05_02_01_14_00_sample06.tgz
私のディレクトリには、次の種類のファイル名を含めることもできます。
a72_a_0.0.0_0.00.04_ac_dc.tgz
ここでファイル名を次のように変更したいと思います。
a53_1c_256K_a_0_0_0_0_00_04_ac_dc.tgz
どうすればいいですか?
答え1
基本的に、最後の点を除いた点を下線に置き換えたいと思います。
Bashのパラメータ拡張を使用すると、これを行うことができます。
for file in * ; do
replace_all=${file//./_}
newname=${replace_all%_*}.${replace_all##*_}
mv "$file" "$newname"
done
//./_
方法すべての点を下線に置き換える%_*
方法最後の下線の後のすべての項目を削除します。##*_
方法最後の下線の前のすべての項目を削除します。
または、最初に拡張子を保存してから削除し、すべての点を下線に置き換えてから拡張子を再追加することもできます。これは読者に練習問題として残す。
答え2
perl
- ベースユーティリティは、検索と置換演算子や翻訳演算子だけでなく、rename
すべてのperl
ステートメントを使用してファイル名を変更できます(ファイル名を変更するように設定したことを確認してください)。s///
y//
$_
からman rename
:
"rename" は、最初の引数で指定された規則に従って指定されたファイル名を変更します。 perlexprパラメーターは、
$_
ファイル名を指定するPerlで少なくともいくつかの文字列を変更すると予想されるPerl式です。与えられたファイル名が式によって変更されない場合、名前は変更されません。コマンドラインにファイル名が指定されていない場合は、標準入力からファイル名を読み込みます。
たとえば、
rename 'my($b,$e) = m/^(.*)\.([^.]+)$/; $b =~ s/\./_/g; $_="$b.$e"' files
これにより、ファイル名がデフォルト名($ b)と拡張子($ e)に分割されます。 $b 次に、すべてのピリオド(.
)を下線で置き換えます。最後$_
にに設定します"$b.$e"
。
出力(-v
詳細オプションを含む):
$ touch top_axi_256_wrapper_05.02.01.14.00_sample06.tgz \
top_axi_128_wrapper_05.02.01.14.00_sample06.tgz \
a72_a_0.0.0_0.00.04_ac_dc.tgz
$ rename -v 'my($b,$e) = m/^(.*)\.([^.]+)$/; $b =~ s/\./_/g; $_="$b.$e"' *
a72_a_0.0.0_0.00.04_ac_dc.tgz renamed as a72_a_0_0_0_0_00_04_ac_dc.tgz
top_axi_128_wrapper_05.02.01.14.00_sample06.tgz renamed as top_axi_128_wrapper_05_02_01_14_00_sample06.tgz
top_axi_256_wrapper_05.02.01.14.00_sample06.tgz renamed as top_axi_256_wrapper_05_02_01_14_00_sample06.tgz
-n
ちなみに、あなたの声明をテストするときに使用してくださいrename
。もっとman rename
:
-n,-ノノ
ジョブなし:名前を変更するファイル名を印刷しますが、名前を変更しません。
Perlは、rename
ほとんどのディストリビューション(rename
Debianのパッケージなど)で利用できます。https://metacpan.org/release/File-Rename