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


回答:


50

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

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

厄介なベースネームを避けてください。;)

Bashには、広範な変数拡張オプションのセットがあります。ここで使用される「%」は、変数の値から最小の一致する接尾辞を削除します。このパターンはグロブパターンなので、${file%.*}機能します。'%%'演算子は、一致する最大の接尾辞を削除し${file%%.*}.htmlます。上記の例では、パターンが修正されているため、abhtmをa.htmlに変換できます。

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


1
また、これらのパラメーター展開はbashに限定されないことに注意してください。これらは、すべてのBourne派生シェル(shkshbashzshdashashなど)で使用できます。拡張は、「シェルコマンド言語」のPOSIX仕様の一部であり移植性に優れています。
クリスジョンセン

11

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

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

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

for file in *.htm
do
    mv "$file" "${file}l"
done

11

rename(1)は、まさに必要なことを行うPerlユーティリティです。この場合:

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

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

(バッシュ4.0とglobstarの設定が必要ですshopt -s globstar

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


1
名前変更は簡単ですが、標準のUNIXプログラムではありません。元の質問では、どのUNIXを指定していません。いくつかの場所で「前名」であるようです。
freiheit

2
renameperlが付属しており、基本的にすべてのunixは最近perlに付属しています。
TRS-80

3
はい。ただし、システムにperlを配置するときに、すべてのUNIXに 'rename'などの補助プログラムが含まれているわけではありません。たとえば、OSXには「名前の変更」はありません。
freiheit

1
@William:二重アスタリスク構文は、Bash 4以降でのみ有効でshopt -s globstar、デフォルトでオフになっています。また、LinuxとUnixにはフォルダーではなくディレクトリがあります。
追って通知があるまで一時停止します。

6
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つ以上の引数を処理する方法のみを知っています。


1
スペースを処理するには、「$ file」を引用する必要があります。
リチャード

元の問題の説明をより強調する必要があります。このシェルワイルドカード展開の動作は驚くべきものであり、Windowsの土地から来た人にとっては直感的でmvはありません。
グレッグヒューギル

3

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

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

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

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


1

最適なツールはmmvです。

mmv \*.htm #1.html

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


1
使用例は失敗します。脱出する必要があり#ます。
クリスチャン・シウピトゥ

いいえ、動作します(私は常にスーパーユーザーに投稿する前にテストします)。#をエスケープする必要があるかどうかは、使用しているシェルによって異なります(zshを使用しています)。
ボルツマイヤー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.