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が指定されている場合、 […] を削除します。