回答:
より良い解決策(外部呼び出しではなくbash機能のみ)については、他の回答の1つを参照してください。
以下は、システムにrename
プログラムをインストールすることを要求し、要求しません(ほとんどの場合、システムでこれを実行します)。
for file in *.html; do
mv "$file" "$(basename "$file" .html).txt"
done
編集:コメントで指摘されているように、これは適切な引用符なしでスペースが含まれているファイル名に対しては機能しません(現在上記で追加されています)。ファイル名にスペースが含まれていないことがわかっている自分のファイルのみで作業する場合は機能しますが、後で再利用される可能性があるものを作成する場合は、適切な引用をスキップしないでください。
ren *.a *.b
$()
レガシーバックティック構文の代わりにPOSIX指定の構文を使用してください。読みやすさが向上し、バックスラッシュでエスケープして、コマンド置換内でリテラルにする必要がある文字がある場合の構文の曖昧さが大幅に軽減されます。
bashを使用する場合、sed、basename、rename、exprなどの外部コマンドは必要ありません。
for file in *.html
do
mv "$file" "${file%.html}.txt"
done
"${file%.*}.txt"
では危険な場合があります。
$
中括弧の中にないことに注意してください!
--
「演算子」も使用しています:mv-"$ file" "$ {file%.html} .txt"この演算子は、次で始まるファイル名を防ぎます引数としてmvによって解析される「-」。
rename 's/\.html$/\.txt/' *.html
まさにあなたが望むことをします。
これはOSXで.txtから.txt_bakまで機能しました
find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;
.txt
する.txt_bak
必要があります_bak
;)
.scss
を.sass
(インプレース変換後...)に変更:find . -name '*.scss' -exec sh -c 'mv "$0" "${0%.scss}.sass"' {} \;
あなたが使いたいrename
:
rename -S .html .txt *.html
これはまさにあなたが望むことを行います-それは一致するすべてのファイルの拡張子をから.html
に変更し.txt
ます*.html
。
注:Greg Hewgillは、これはbash組み込みではないことを正しく指摘しています。とは別のLinuxコマンドです。Linuxで何かが必要な場合、これは問題なく動作します。もっとクロスプラットフォームが必要な場合は、他の答えの1つを見てください。
rename
プログラムは関連してbash
おらず、すべてのプラットフォームで利用できるわけでもありません。Linuxでしか見たことがない。
rename -S .html .text *.html
ところ-S
の略--subst-all
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
他の誰かの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' - {}
ls
。このコマンドはばかげています:グロブをls
直接使用するのではなく、でグロブを無意味に使用します。これは、スペース、引用符、および(引用符がないため)グロブ文字を含むファイル名で壊れます。
これは、一度に複数の拡張機能を変更するのに適した方法です。
for fname in *.{mp4,avi}
do
mv -v "$fname" "${fname%.???}.mkv"
done
注:拡張サイズが同じになるように注意してください(???)
PERLを使用したい場合は、PERLの作成者であるLarry Wallによって最初に記述された短いPERLスクリプトがあり、ここで意図したとおりに動作します: tips.webdesign10.com/files/rename.pl.txt。
あなたの例では、次のことがうまくいくはずです:
rename.pl 's/html/txt/' *.html
1行、ループなし:
ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
例:
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json ac8453e2-0d82-4d43-b80e-205edb754700.json
$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt ac8453e2-0d82-4d43-b80e-205edb754700.txt
残念ながら、移植可能にするのは簡単ではありません。おそらく少しexprの魔法が必要です。
for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done
満足したら、エコーを削除します。
編集: basename
この特定のケースではおそらく少し読みやすくなりますexpr
が、一般的にはより柔軟です。
また、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