web-dev-qa-db-ja.com

1つのコマンドでファイルのグループの名前を変更する

拡張子が.htmのファイルのグループがある場合、それらをすべて.htmlに名前変更するにはどうすればよいですか?

mv *.htm *.html

動作しません。

38
Richard Hoskins

または、純粋なbashを使用することもできます...(mvを除き、つまり..)

for file in *.htm; do mv "$file" "${file%.htm}.html"; done

厄介なベースネームの要素は避けてください。 ;)

Bashには、さまざまな変数拡張オプションがあります。ここで使用されている '%'は、変数の値から一致する最小のサフィックスを削除します。パターンはグロブパターンなので、${file%.*}も機能します。 '%%'演算子は、一致する最大のサフィックスを削除し、パターンが固定されているため、上記の例では${file%%.*}.htmlはa.b.htmをa.htmlに変換します。

より巧妙なトリックについては、bashのマンページの変数置換のセクションを参照してください。 bash内で直接実行できることはたくさんあります。

50
falstro

rename(1)は、望みどおりの動作をするPerlユーティリティです。この場合:

rename 's/\.htm$/.html/' *htm

または、サブディレクトリも使用している場合

(Bash 4.0とglobstar設定が必要です:shopt -s globstar

rename 's/\.htm$/.html/' **/*htm

11
TRS-80

ファイル名にスペース、改行、その他の空白を入れてはいけませんが、このバージョンのフライハイトの回答はそれらを処理します。また、読みやすくするために、他の利点とともにバックティックの代わりに$()を使用します。

for file in *.htm
do
    mv "$file" "$(basename "$file" .htm).html"
done

さらに良い-最後に追加するだけの特別な場合:

for file in *.htm
do
    mv "$file" "${file}l"
done
for file in *.htm; do
  mv $file `basename "$file" .htm`.html
done

初めてechoの前でmvを試してみてください。

オリジナルの問題は、「mv *.htm *.html "には*sはシェルによって処理されるため、mvコマンドは、現在のディレクトリにあるすべての.htmおよび.htmlファイルのリストを表示するだけです。つまり、「mv foo.htm bar.htm stuff.htm six.htm file.htm "。最後の引数がディレクトリの場合、mvは2つ以上の引数を処理する方法のみを認識します。

6
freiheit

文字列置換を使用したさらに別の純粋なbashの例。

for file in *.htm; do mv $file ${file/htm/html}; done

Extra-これは文字列のすべての出現を置き換えます

for file in *.htm; do mv $file ${file//htm/html}; done
3
xalupadas

Zsh を使用する場合、「zmv」を使用できます

1
Martin

最良のツールは mmv です。

mmv \*.htm #1.html

GNU/Linuxコマンドラインツールの概要 」のその他の使用例(およびその他のツール)。

1
bortzmeyer

util-linux-ngパッケージ(Fedoraの場合)には、 TRS-8 で言及されているものと同様のrenameコマンドがあります。次のように使用できます。

rename .htm .html *.html
0