Linux では、次のコマンド:
for f in *; do cp "$f" "$f"_copy; done
「_copy」文字列がファイル拡張子の後に追加されfoo.png_copy
、foo_copy.png
. どうすれば修正できますか?文字列をスライスできますか?
for f in *; do
prefix="${f%.*}"
suffix="${f:${#prefix}}"
cp "$f" "${prefix}_copy${suffix}"
done
これは、「.*」に一致するサフィックスをトリミングして、ファイル名のプレフィックスを見つけます。ファイル名に拡張子がない場合、これはファイル名全体になることに注意してください。複数のピリオドがある場合は、最後のピリオドのみが削除されます (たとえば、"this.that.etc.png" という名前のファイルの場合、"this.that.etc" にトリミングされます)。${#prefix}
次に、プレフィックス ( )の長さに基づいてファイル名をスライスすることにより、サフィックスを見つけます。これは、何かが削除されたかどうかに関係なく、期待どおりに機能します。
警告: これは、拡張子を持つピリオドを含むファイル名を扱います。たとえば、「file_v1.0」は「file_v1_copy.0」にコピーされます。
注: 必要に応じて、$suffix の定義をスキップ${f:${#prefix}}
して、copy コマンドでインラインを使用することもできますが、これはより明確だと思います。
ファイル名にピリオドしかない場合
rename ".png" "_copy.png" *.png
もっと
man rename
を使用basename
し、2 番目の引数を渡します。
for f in *; do
cp "$f" "$(basename "$f" .png)_copy.png"
done
によるとbasename(1)
:
あらすじ
basename
文字列[サフィックス]説明
ユーティリティは、サフィックス
basename
が指定されている場合、 […] を削除します。