ディレクトリ内のすべてのファイルの名前を$ filename_hから$ filename_halfに変更しますか?


139

とてもシンプルです。

名前を変更するには

05_h.png
06_h.png

05_half.png
06_half.png

少なくとも、私はそれは簡単だと思いますが、あなたが既に知らない限り、この種のことのためにグーグルすることは難しいです。

ありがとう...

回答:


301

bashを使用するだけで、外部コマンドを呼び出す必要はありません。

for file in *_h.png
do
  mv "$file" "${file/_h.png/_half.png}"
done

追加しないでください #!/bin/sh

そのワンライナーを必要とする人のために:

for file in *.png; do mv "$file" "${file/_h.png/_half.png}"; done

7
sedではなくbashの組み込みの文字列置換を
うまく使用

3
file / _h.png / _half.png正規表現ですか?
user2799603 2014

15
いいえ、形式は次のとおりです:$ {string / substring / substitution} –「最初に出現するものを置き換える」。詳細については、このチートシート(「文字列」セクション)を確認してください:bruxy.regnet.cz/linux/bash_cheatsheet/bash_cheatsheet.pdf
WindRider

11
理由はありDo not add #!/bin/shますか?このステートメントを使用して、または使用せずに両方を試してみました。
ライアン

6
@Ryan @Ishan Jain実際には、スクリプトを実行する必要があるバックエンドシェルを示します。shとbashは異なるシェルであるため、スクリプトの動作と構文に影響を与える可能性があります。スクリプトはbashの組み込み文字列置換を使用するため、ヘッダーを追加する必要があります#!/bin/bash。つまり、bashは通常多くのコンピューターのデフォルトシェルなので、多くの違いは見つかりません:D詳細はこちら
Cristian Ramon-Cortes

65

renameコマンドを試してください:

rename 's/_h.png/_half.png/' *.png

更新:

使用例:

コンテンツを作成する

$ mkdir /tmp/foo
$ cd /tmp/foo
$ touch one_h.png two_h.png three_h.png
$ ls 
one_h.png  three_h.png  two_h.png

テストソリューション:

$ rename 's/_h.png/_half.png/' *.png
$ ls
one_half.png  three_half.png  two_half.png

1
@CarolineAlexiou:サンプルテストセッションを追加しました。ぜひお試しください。おそらくタイプミスがあるでしょう。の出力はls何ですか?rename ...あなたは何を試しますか?
のMichałŠrajer

2
Macのbashでは機能しません、fwiw。renameは標準のUnixツールではありません。
tandrewnichols 2015年

1
@tandrewnichols、試してみる自作を -インストールしたら、名前の変更をして数秒で使用可能になるbrew install rename
Simbamangu

4
私と同じように名前の変更は機能しませんでした's//'-私は男性を参照しrename [options] expression replacement file...、簡単な概要がありました:、CentOS 7、バージョン:rename from util-linux 2.23.2
tymik

2
覚えておいて.、リテラルのドットのための使用を-任意の文字だけではなく、ドットと一致する\.代わりに
マイズナー

11
for f in *.png; do
  fnew=`echo $f | sed 's/_h.png/_half.png/'`
  mv $f $fnew
done

1
これは、事前に予行演習を行うのに最適です。最初に2行目をに置き換えmv $f $fnewecho $fnew、出力が正常に見えるようにしています。
ロバティ2017

10

純粋なbashソリューションをお探しですか?多くのアプローチがありますが、ここに1つあります。

for file in *_h.png ; do mv "$file" "${file%%_h.png}_half.png" ; done

これは、現在のディレクトリで終わるファイルだけ_h.pngが、名前を変更するファイルであることを前提としています。

より具体的に

for file in 0{5..6}_h.png ; do mv "$file" "${file/_h./_half.}" ; done

これらの2つの例を想定するのはあなただけです。ファイル。

一般的なケースでは、ファイルがで名前を変更している されて カバー する前に


6

renameperlで作成されたユーティリティを使用します。デフォルトでは利用できないかもしれませんが...

$ touch 0{5..6}_h.png

$ ls
05_h.png  06_h.png

$ rename 's/h/half/' *.png

$ ls
05_half.png  06_half.png

4
for i in *_h.png ; do
  mv $i `echo "$i"|awk -F'.' '{print $1"alf."$2}'`
done

4

私は同様の質問がありました:マニュアルでは、名前の変更は次のように説明されています

rename [option] expression replacement file

このように使用できます

rename _h _half *.png

コードでは: '_h'は探している式です。'_half'は、置換するパターンです。'* .png'は、可能なターゲットファイルを探しているファイルの範囲です。

これがcに役立つことを願っています:


1

別のアプローチは、バッチの名前変更オプションを手動で使用することです

ファイルを右クリックして、[ファイルのカスタムコマンド]、[名前の一括変更]をクリックします。hを置き換えることができます。半分で。

これは、WinSCPなどを使用したLinuxベースのGUIで機能します


0

renameユーティリティを使用します。

rc@bvm3:/tmp/foo $ touch 05_h.png 06_h.png
rc@bvm3:/tmp/foo $ rename 's/_h/_half/' * 
rc@bvm3:/tmp/foo $ ls -l
total 0
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 05_half.png
-rw-r--r-- 1 rc rc 0 2011-09-17 00:15 06_half.png


0

が、応答セットが完了すると、私は別の行方不明1を追加する必要があります。

for i in *_h.png;
  do name=`echo "$i" | cut -d'_' -f1`
  echo "Executing of name $name" 
  mv "$i" "${name}_half.png"
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.