拡張子が.htmのファイルのグループがある場合、それらをすべて.htmlに名前変更するにはどうすればよいですか?
mv *.htm *.html
動作しません。
または、純粋なbashを使用することもできます...(mvを除き、つまり..)
for file in *.htm; do mv "$file" "${file%.htm}.html"; done
厄介なベースネームの要素は避けてください。 ;)
Bashには、さまざまな変数拡張オプションがあります。ここで使用されている '%'は、変数の値から一致する最小のサフィックスを削除します。パターンはグロブパターンなので、${file%.*}
も機能します。 '%%'演算子は、一致する最大のサフィックスを削除し、パターンが固定されているため、上記の例では${file%%.*}.html
はa.b.htmをa.htmlに変換します。
より巧妙なトリックについては、bashのマンページの変数置換のセクションを参照してください。 bash内で直接実行できることはたくさんあります。
rename(1)
は、望みどおりの動作をするPerlユーティリティです。この場合:
rename 's/\.htm$/.html/' *htm
または、サブディレクトリも使用している場合
(Bash 4.0とglobstar設定が必要です:shopt -s globstar
)
rename 's/\.htm$/.html/' **/*htm
ファイル名にスペース、改行、その他の空白を入れてはいけませんが、このバージョンのフライハイトの回答はそれらを処理します。また、読みやすくするために、他の利点とともにバックティックの代わりに$()
を使用します。
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つ以上の引数を処理する方法のみを認識します。
文字列置換を使用したさらに別の純粋なbashの例。
for file in *.htm; do mv $file ${file/htm/html}; done
Extra-これは文字列のすべての出現を置き換えます
for file in *.htm; do mv $file ${file//htm/html}; done
Zsh を使用する場合、「zmv」を使用できます
util-linux-ngパッケージ(Fedoraの場合)には、 TRS-8 で言及されているものと同様のrename
コマンドがあります。次のように使用できます。
rename .htm .html *.html