
以下のファイルセットがあります
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
-basedユーティリティは、検索と置換演算子や変換演算子だけでなく、任意のステートメントを使用してファイルの名前を変更できます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、-nono
アクションなし: 名前を変更するファイルの名前を印刷しますが、名前は変更しません。
perlはrename
ほとんどのディストリビューションでパッケージ化されており(例えばrename
Debianのパッケージ)、https://metacpan.org/release/ファイルの名前変更