回答:
または、純粋なbashを使用することもできます(mvを除く、つまり..)
for file in *.htm; do mv "$file" "${file%.htm}.html"; done
厄介なベースネームを避けてください。;)
Bashには、広範な変数拡張オプションのセットがあります。ここで使用される「%」は、変数の値から最小の一致する接尾辞を削除します。このパターンはグロブパターンなので、${file%.*}
機能します。'%%'演算子は、一致する最大の接尾辞を削除し${file%%.*}.html
ます。上記の例では、パターンが修正されているため、abhtmをa.htmlに変換できます。
より巧妙なトリックについては、bashのマンページの可変置換セクションを参照してください。bash内で直接できることはたくさんあります。
ファイル名にスペース、改行、その他の空白を含めることはできませんが、このバージョンのfreiheitの回答はそれらを処理します。また$()
、他の利点とともに読みやすさのためにバックティックの代わりに使用します。
for file in *.htm
do
mv "$file" "$(basename "$file" .htm).html"
done
さらに良い-最後に追加するだけの特別な場合:
for file in *.htm
do
mv "$file" "${file}l"
done
rename(1)
は、まさに必要なことを行うPerlユーティリティです。この場合:
rename 's/\.htm$/.html/' *htm
または、サブディレクトリも使用している場合
(バッシュ4.0とglobstarの設定が必要ですshopt -s globstar
)
rename 's/\.htm$/.html/' **/*htm
rename
perlが付属しており、基本的にすべてのunixは最近perlに付属しています。
shopt -s globstar
、デフォルトでオフになっています。また、LinuxとUnixにはフォルダーではなくディレクトリがあります。
for file in *.htm; do
mv $file `basename "$file" .htm`.html
done
初めてecho
目の前で試してみてくださいmv
。
オリジナルの問題は、 " mv *.htm *.html
"が*
シェルによって処理されるため、mv
コマンドは単に現在のディレクトリ内のすべての.htmおよび.htmlファイルのリストを表示することです。つまり、「mv foo.htm bar.htm stuff.htm six.htm file.htm
」のようなものです。最後の引数がディレクトリである場合、mvは3つ以上の引数を処理する方法のみを知っています。
mv
はありません。
#
ます。
UTIL-Linuxの-ngの(Fedoraの上の)パッケージが有するrename
挙げたものと同様のコマンドTRS-80。次のように使用できます。
rename .htm .html *.html
ren *.htm *.html
、Windowsで動作します。