533

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

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

4

28 に答える 28

738

bash を使用している場合、sed、basename、rename、expr などの外部コマンドは必要ありません。

for file in *.html
do
  mv "$file" "${file%.html}.txt"
done
于 2009-08-04T00:17:20.137 に答える
412

より良い解決策 (外部呼び出しではなく、bash 機能のみを使用) については、他の回答のいずれかを参照してください。


次のようにすると、システムがプログラムを持っている必要はありませんrename(ただし、ほとんどの場合、システムにはこれがあります)。

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

編集:コメントで指摘されているように、これは適切な引用符なしでスペースを含むファイル名では機能しません(現在は上に追加されています)。ファイル名にスペースが含まれていないことがわかっている自分のファイルだけを操作する場合はこれで問題ありませんが、後で再利用する可能性のあるものを記述する場合は、適切な引用を省略しないでください。

于 2009-08-03T21:46:11.330 に答える
199
rename 's/\.html$/\.txt/' *.html

あなたが望むことを正確に行います。

于 2009-08-03T21:45:35.840 に答える
98

使用したいrename

rename -S <old_extension> <new_extension> <files>

rename -S .html .txt *.html

これはまさにあなたが望むことを行います -一致するすべてのファイルの拡張子を から.htmlに変更します。.txt*.html

注: Greg Hewgill は、これが bash 組み込みではないことを正しく指摘しています。独立した Linux コマンドです。Linux で何かが必要な場合は、これで問題なく動作するはずです。さらにクロスプラットフォームが必要な場合は、他の回答のいずれかを見てください。

于 2009-08-03T21:44:13.893 に答える
16

Ubuntu ユーザーの場合:

rename 's/\.html$/\.txt/' *.html
于 2015-02-27T08:00:40.647 に答える
8

名前変更コマンドの例を次に示します。

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
于 2014-09-28T05:19:46.953 に答える
6

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
于 2019-05-13T20:55:00.720 に答える
4

他の誰かの 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"

ただし修正が必要: ファイル名のスペースの処理

于 2014-07-03T11:51:12.893 に答える
3

パーティーには少し遅れました。あなたは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' - {}
于 2015-06-17T10:09:07.660 に答える
2

PERL の方が好きな場合は、 tips.webdesign10.com/files/ rename.pl.txtで目的を正確に実行する短い PERL スクリプト (PERL の作成者である Larry Wall によって作成されたもの) があります。

あなたの例では、次のようにする必要があります。

rename.pl 's/html/txt/' *.html
于 2013-06-28T12:13:57.550 に答える
0

残念ながら、移植可能にすることは簡単ではありません。おそらくexprマジックが少し必要です。

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

満足したら、エコーを削除します。

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

于 2009-08-03T21:45:35.343 に答える
0

最も簡単な方法はrename.ul 、Linuxディストリビューションのほとんどに存在する使用することです

rename.ul -o -v [旧ファイル拡張子] [新ファイル拡張子] [適用するファイルを検索する式]

rename.ul -o -v .oldext .newext *.oldext

オプション:

-o: 既存の .newext を上書きしない

-v: 詳細

-n: ドライラン

于 2021-07-10T05:44:35.610 に答える