拡張子の前にファイル名にテキストを追加する


25

ファイル名の最後に、拡張子の前にテキストを追加したいと思います。今、私はしようとしています、

for f in *.shp; do echo $f_poly; done

出力は、

Quercus_acutifolia.shp_poly
Quercus_agrifolia.shp_poly
Quercus_corrugata.shp_poly
Quercus_cortesii.shp_poly
Quercus_costaricensis.shp_poly
Quercus_havardii.shp_poly
Quercus_hemisphaerica.shp_poly
Quercus_kelloggii.shp_poly
Quercus_knoblochii.shp_poly
Quercus_laceyi.shp_poly

なりたい

Quercus_acutifolia_poly.shp
Quercus_agrifolia_poly.shp
Quercus_corrugata_poly.shp
Quercus_cortesii_poly.shp
Quercus_costaricensis_poly.shp
Quercus_havardii_poly.shp
Quercus_hemisphaerica_poly.shp
Quercus_kelloggii_poly.shp
Quercus_knoblochii_poly.shp
Quercus_laceyi_poly.shp

回答:


27

標準POSIXパラメーター展開を使用:

for f in *.shp; do printf '%s\n' "${f%.shp}_poly.shp"; done

それはまさに私が必要としたものです。
-Sam007

1
それがどのように機能するかを説明することで改善されるかもしれません。一方、ダグの答えは非常に簡単です。
セージボルシュ

@SargeBorsch何を説明する必要がありますか?私の答え、質問の抜粋、およびダグの答えは数文字だけ異なり、ダグの答えは私のものよりもさらに少ないので、あなたが何を望んでいるかわかりません。問題の2つの出力の違いを比較するだけで、それらが何をするのかを簡単に理解できるはずです。私の答えがダグよりも望ましい理由を説明できます。1. printf移植性が低いのではなく、フォーマット文字列を使用しますecho。2. basenameこのような単純なタスクでは、外部バイナリ()を呼び出すよりも効率的なパラメーター拡張を使用します。
jw013

次に、ファイルの名前を変更するコマンドは、このようになります:for f in *.shp; do mv $f ${f%.shp}_poly.shp; done
Patch92

6

「名前変更」というツールがインストールされている場合があります。

rename 's/\.shp$/_poly.shp/' *shp

ポータブルではないかもしれませんが、使いやすいです。


1
これは私のために働いた唯一のもの、素晴らしい答えです!
wanderer0810

4

これを使って:

for file in *.shp; do echo $(basename $file .shp)_poly.shp; done

3
使用basenameは、シェルに単独で作業をさせるよりも遅く、効率的ではありません。これは、非常に多数のファイルで顕著です。
jw013

また、欠落している引用符と--sがあり、ファイル名の前に改行文字がある場合は失敗します.shp
ステファンシャゼル

私の目的のために実際に働くことができる答えを与えてくれてありがとう。これは、ゴルフのコードではなく、bashのヘルプです。(これを読んでください。.私は皮肉をこめていたように聞こえるかもしれません。ここであなたよりも他の答えについてもっと把握しています。ありがとうございます。)
Tim

3

これは私にとってはうまくいきました:

for f in *; do NEW=${f%.webm}_2016.webm; mv ${f} "${NEW}"; done


まあ、これはあなたがおそらく望んfor f in *.webmでいることを除いて、受け入れられた答えによく似ています、あなたは引用符を忘れて${f}、あなたは行方不明--です
ステファンシャゼラス

1
受け入れられた答えはOSXでは機能せず、新しいファイル名のみを出力します。実際にはファイルの名前を変更しません
Vinnie James

1
もちろん、シェル名を使用して新しいファイル名を取得する方法を示します。質問では、ファイル名も(でecho)出力されますが、必須ではありません。
ステファンシャゼラス

1

それらが異なる場所にある場合は、実行します-

for i in ` find /root/test/ -name "*.shp" ` ;
do
  mv $i ` echo $i | sed 's/.shp$/_poly.shp/g' ` ;
done

1

質問は、bash regexpsbashを使用できるため、外部ユーティリティは必要ないためです。

for i in *.shp
do
    mv -v "${i}" "${i%.*}_MYSUFFIX.${i##*.}"
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.