1

Linux では、次のコマンド:

for f in *; do cp "$f" "$f"_copy; done

「_copy」文字列がファイル拡張子の後に追加されfoo.png_copyfoo_copy.png. どうすれば修正できますか?文字列をスライスできますか?

4

3 に答える 3

6
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 コマンドでインラインを使用することもできますが、これはより明確だと思います。

于 2013-05-13T04:55:34.150 に答える
2

ファイル名にピリオドしかない場合

rename ".png" "_copy.png"  *.png

もっと

man rename
于 2013-05-17T06:47:37.977 に答える
2

を使用basenameし、2 番目の引数を渡します。

for f in *; do
    cp "$f" "$(basename "$f" .png)_copy.png"
done

によるとbasename(1)

あらすじ

basename 文字列[サフィックス]

説明

ユーティリティは、サフィックスbasenameが指定されている場合、 […] を削除します。

于 2013-05-13T04:24:29.817 に答える