web-dev-qa-db-ja.com

たくさんのファイルの拡張子を変更するにはどうすればいいですか?

ディレクトリに、たくさんの*.htmlファイルがあります。それらすべてを*.txtに名前変更したいです。

どうやってやるの?私はbashシェルを使います。

428
bmw0128

より良い解決策(外部呼び出しとは対照的にbash機能のみを使用)については、 他の答えの1つを参照してください


以下はシステムがrenameプログラムを持つことを要求したり要求したりしないでしょう(あなたが最も頻繁にこれをシステム上に持つでしょうが):

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

編集:コメントで指摘されているように、これは適切な引用符なしでファイル名にスペースが含まれている場合には機能しません(上記で追加)。あなたが純粋にあなた自身が知っているファイル名でスペースを持っていない作業をするとき、これはうまくいくでしょう、しかしあなたが後で再利用されるかもしれない何かを書くときはいつでも、適切な引用を飛ばさないでください。

343
Mikael Auno

Bashを使用している場合は、sed、basename、rename、exprなどの外部コマンドは不要です。

for file in *.html
do
  mv "$file" "${file%.html}.txt"
done
614
ghostdog74
rename 's/\.html$/\.txt/' *.html

あなたが望むものを正確に行います。

179
Amber

これは私には.txtから.txt_bakまでのOSXでうまくいった

find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;
88
Steven Lizarazo

rename を使います。

rename -S .html .txt *.html

これはまさにあなたが望むことをします - それは.htmlにマッチするすべてのファイルのために.txtから*.htmlへ拡張子を変えるでしょう。

注:Greg Hewgillは、これはbash組み込みではないと正しく指摘しています。これは別のLinuxコマンドです。 Linux上で何かが必要なだけなら、これでうまくいくはずです。もっとクロスプラットフォームなものが必要な場合は、他の答えの1つを見てください。

87
DaveR

Macでは...

  1. インストールしていない場合は、 rename をインストールしてください:brew install rename
  2. rename -S .html .txt *.html
33
izilotti

Ubuntuユーザーの場合:

rename 's/\.html$/\.txt/' *.html
15
Bheru Lal Lohar

これはrenameコマンドの例です:

rename -n ’s/\.htm$/\.html/’ *.htm

-nはテスト実行であり、実際にはファイルを変更しないことを意味します。 -nを削除した場合に名前が変更されるファイルのリストが表示されます。上記の場合、現在のディレクトリ内のすべてのファイルを.htmのファイル拡張子から.htmlに変換します。

上記のテスト実行の出力が問題ないようなら、最終版を実行することができます。

rename -v ’s/\.htm$/\.html/’ *.htm

-vはオプションですが、以下の出力例に示すように、renameコマンドによって行われた変更の唯一のレコードであるため、含めることをお勧めします。

$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html

真ん中のトリッキーな部分は、以下で強調されている、正規表現によるPerlの置換です。

rename -v ’s/\.htm$/\.html/’ *.htm
7
A.A

この質問は明示的にBashについて言及しています、しかしもしあなたがZSHを利用可能にしたならば、それはとても簡単です:

zmv '(*).*' '$1.txt'

あなたがzsh: command not found: zmvを得たならば、単に実行してください:

autoload -U zmv

そしてもう一度やり直してください。

Zmvに関するヒントを提供してくれた、この オリジナル記事 に感謝します。

5
Michael Leonard

これはOSXとLinuxで動く、私が見つけた最も簡単な解決策です、そしてそれはgitでもうまく働きます!

find . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;

そしてgitで:

find . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;

5
bdombro

他の誰かのWebサイトがクロールされた後、私は何千ものファイルが拡張子.htmlを付けずにたくさんのサブディレクトリに渡ってしまいました。

拡張子が.htmlのファイルを除いて、それらの名前をすべて一括して変更するには(ほとんどのファイルにはまったく追加されていませんでした)、これは私にとって役に立ちました。

cd wwwroot
find . -xtype f \! -iname *.html   -exec mv -iv "{}"  "{}.html"  \;  # batch rename files to append .html suffix IF MISSING

OPの場合は、*。txtファイルの名前だけを変更するように、少し変更します。

find . -xtype f  -iname *.txt   -exec filename="{}"  mv -iv ${filename%.*}.{txt,html}  \; 

故障しました(忙しい!):

-iname * .txt
- 既に.txtで終わるファイルのみを考慮する

mv -iv "{}。{txt、html}" - findがファイル名として{}を渡すと、$ {filename%。*}が抽出されます。 mvへのパラメータを形成するための拡張子なしのベース名。 bashは{txt、html}を2つのパラメータとして書き換えるので、最後のコマンドは次のように実行されます。mv -iv "filename.txt" "filename.html"

しかし必要な修正:ファイル名のスペースを扱う

5
Marcos

コマンドmmv は、膨大な数のファイル(毎秒数万)に対して非常に効率的にこのタスクを実行するようです。たとえば、すべての.xmlファイルを.htmlファイルに名前変更するには、次のようにします。

mmv ";*.xml" "#1#2.html"

;はパスと一致し、*はファイル名と一致し、これらは置換名では#1および#2として参照されます。

execまたはパイプに基づく回答は非常に多くのファイルに対して遅すぎるか失敗しました。

4
Roko Mijic

パーティーに少し遅れました。あなたはxargsでそれをすることができます:

ls *.html | xargs -I {} sh -c 'mv $1 `basename $1 .html`.txt' - {}

または、すべてのファイルが特定のフォルダにある場合

ls folder/*.html | xargs -I {} sh -c 'mv $1 folder/`basename $1 .html`.txt' - {}
3
esp

これを試して

rename .html .txt *.html 

使用法:

rename [find] [replace_with] [criteria]
3
P Sreedhar

あなたがPerlを好むなら、あなたがここで欲しいものを正確にする短いPerlスクリプト(Perlの創作者であるLarry Wallによって書かれたもの)があります: tips.webdesign10.com/files/rename.pl.txt 。あなたの例のために、以下はトリックをするべきです

rename.pl 's/html/txt/' *.html

=)

(更新されたURLをありがとう@loretoparisi)

2
dudusan

残念ながら、移植性のあることを行うのは簡単なことではありません。あなたはおそらく少しexprの魔法が必要です。

for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done

満足したらエコーを取り除きます。

編集:basenameはおそらくこの特定のケースでもう少し読みやすくなりますが、exprは一般により柔軟です。

1
CB Bailey

これは一度に複数の拡張子を変更するのに良い方法です。

for fname in *.{mp4,avi}
do
   mv -v "$fname" "${fname%.???}.mkv"
done

注:同じであることを拡張サイズに注意してください(???)

1
Nick De Greek

素敵&シンプル!

find . -iname *.html  -exec mv {} "$(basename {} .html).text"  \;
1
Deano

これは私が.Edgeファイルを.blade.phpに改名するために使用したものです。

for file in *.Edge; do     mv "$file" "$(basename "$file" .Edge).blade.php"; done

魅力のように動作します。

0
Nixon Kosgei

また、Bashで関数を作成し、.bashrcなどに追加して、必要な場所で使用することもできます。

change-ext() {
    for file in *.$1; do mv "$file" "$(basename "$file" .$1).$2"; done
}

使用法:

change-ext css scss

関数内のコードのソース: https://stackoverflow.com/a/1224786/6732111

0
J Kluseczka

1行、ループなし:ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}

cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json  ac8453e2-0d82-4d43-b80e-205edb754700.json
cbongiorno@ip-172-31-26-242:~/pgsql$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt  ac8453e2-0d82-4d43-b80e-205edb754700.txt
cbongiorno@ip-172-31-26-242:~/pgsql$ 
0