ディレクトリに、たくさんの*.html
ファイルがあります。それらすべてを*.txt
に名前変更したいです。
どうやってやるの?私はbashシェルを使います。
より良い解決策(外部呼び出しとは対照的にbash機能のみを使用)については、 他の答えの1つを参照してください 。
以下はシステムがrename
プログラムを持つことを要求したり要求したりしないでしょう(あなたが最も頻繁にこれをシステム上に持つでしょうが):
for file in *.html; do
mv "$file" "$(basename "$file" .html).txt"
done
編集:コメントで指摘されているように、これは適切な引用符なしでファイル名にスペースが含まれている場合には機能しません(上記で追加)。あなたが純粋にあなた自身が知っているファイル名でスペースを持っていない作業をするとき、これはうまくいくでしょう、しかしあなたが後で再利用されるかもしれない何かを書くときはいつでも、適切な引用を飛ばさないでください。
Bashを使用している場合は、sed、basename、rename、exprなどの外部コマンドは不要です。
for file in *.html
do
mv "$file" "${file%.html}.txt"
done
rename 's/\.html$/\.txt/' *.html
あなたが望むものを正確に行います。
これは私には.txtから.txt_bakまでのOSXでうまくいった
find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;
rename
を使います。
rename -S .html .txt *.html
これはまさにあなたが望むことをします - それは.html
にマッチするすべてのファイルのために.txt
から*.html
へ拡張子を変えるでしょう。
注:Greg Hewgillは、これはbash組み込みではないと正しく指摘しています。これは別のLinuxコマンドです。 Linux上で何かが必要なだけなら、これでうまくいくはずです。もっとクロスプラットフォームなものが必要な場合は、他の答えの1つを見てください。
Macでは...
brew install rename
rename -S .html .txt *.html
Ubuntuユーザーの場合:
rename 's/\.html$/\.txt/' *.html
これは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
この質問は明示的にBashについて言及しています、しかしもしあなたがZSHを利用可能にしたならば、それはとても簡単です:
zmv '(*).*' '$1.txt'
あなたがzsh: command not found: zmv
を得たならば、単に実行してください:
autoload -U zmv
そしてもう一度やり直してください。
Zmvに関するヒントを提供してくれた、この オリジナル記事 に感謝します。
これは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' - '{}' \;
他の誰かの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"
しかし必要な修正:ファイル名のスペースを扱う
コマンドmmv
は、膨大な数のファイル(毎秒数万)に対して非常に効率的にこのタスクを実行するようです。たとえば、すべての.xml
ファイルを.html
ファイルに名前変更するには、次のようにします。
mmv ";*.xml" "#1#2.html"
;
はパスと一致し、*
はファイル名と一致し、これらは置換名では#1
および#2
として参照されます。
exec
またはパイプに基づく回答は非常に多くのファイルに対して遅すぎるか失敗しました。
パーティーに少し遅れました。あなたは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' - {}
これを試して
rename .html .txt *.html
使用法:
rename [find] [replace_with] [criteria]
あなたがPerlを好むなら、あなたがここで欲しいものを正確にする短いPerlスクリプト(Perlの創作者であるLarry Wallによって書かれたもの)があります: tips.webdesign10.com/files/rename.pl.txt 。あなたの例のために、以下はトリックをするべきです
rename.pl 's/html/txt/' *.html
=)
(更新されたURLをありがとう@loretoparisi)
残念ながら、移植性のあることを行うのは簡単なことではありません。あなたはおそらく少しexprの魔法が必要です。
for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done
満足したらエコーを取り除きます。
編集:basename
はおそらくこの特定のケースでもう少し読みやすくなりますが、expr
は一般により柔軟です。
これは一度に複数の拡張子を変更するのに良い方法です。
for fname in *.{mp4,avi}
do
mv -v "$fname" "${fname%.???}.mkv"
done
注:同じであることを拡張サイズに注意してください(???)
素敵&シンプル!
find . -iname *.html -exec mv {} "$(basename {} .html).text" \;
これは私が.Edge
ファイルを.blade.php
に改名するために使用したものです。
for file in *.Edge; do mv "$file" "$(basename "$file" .Edge).blade.php"; done
魅力のように動作します。
また、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
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$