ディレクトリには、たくさんの*.html
ファイルがあります。すべての名前を次のように変更したい*.txt
どうやってやるの?私はbashシェルを使用しています。
ディレクトリには、たくさんの*.html
ファイルがあります。すべての名前を次のように変更したい*.txt
どうやってやるの?私はbashシェルを使用しています。
bash を使用している場合、sed、basename、rename、expr などの外部コマンドは必要ありません。
for file in *.html
do
mv "$file" "${file%.html}.txt"
done
より良い解決策 (外部呼び出しではなく、bash 機能のみを使用) については、他の回答のいずれかを参照してください。
次のようにすると、システムがプログラムを持っている必要はありませんrename
(ただし、ほとんどの場合、システムにはこれがあります)。
for file in *.html; do
mv "$file" "$(basename "$file" .html).txt"
done
編集:コメントで指摘されているように、これは適切な引用符なしでスペースを含むファイル名では機能しません(現在は上に追加されています)。ファイル名にスペースが含まれていないことがわかっている自分のファイルだけを操作する場合はこれで問題ありませんが、後で再利用する可能性のあるものを記述する場合は、適切な引用を省略しないでください。
rename 's/\.html$/\.txt/' *.html
あなたが望むことを正確に行います。
使用したいrename
:
rename -S <old_extension> <new_extension> <files>
rename -S .html .txt *.html
これはまさにあなたが望むことを行います -一致するすべてのファイルの拡張子を から.html
に変更します。.txt
*.html
注: Greg Hewgill は、これが bash 組み込みではないことを正しく指摘しています。独立した Linux コマンドです。Linux で何かが必要な場合は、これで問題なく動作するはずです。さらにクロスプラットフォームが必要な場合は、他の回答のいずれかを見てください。
Ubuntu ユーザーの場合:
rename 's/\.html$/\.txt/' *.html
名前変更コマンドの例を次に示します。
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
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
他の誰かの 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"
ただし修正が必要: ファイル名のスペースの処理
パーティーには少し遅れました。あなたは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' - {}
PERL の方が好きな場合は、 tips.webdesign10.com/files/ rename.pl.txtで目的を正確に実行する短い PERL スクリプト (PERL の作成者である Larry Wall によって作成されたもの) があります。
あなたの例では、次のようにする必要があります。
rename.pl 's/html/txt/' *.html
残念ながら、移植可能にすることは簡単ではありません。おそらくexprマジックが少し必要です。
for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done
満足したら、エコーを削除します。
編集: 一般的にはより柔軟ですがbasename
、おそらくこの特定のケースではもう少し読みやすいです。expr
最も簡単な方法はrename.ul
、Linuxディストリビューションのほとんどに存在する使用することです
rename.ul -o -v [旧ファイル拡張子] [新ファイル拡張子] [適用するファイルを検索する式]
rename.ul -o -v .oldext .newext *.oldext
オプション:
-o: 既存の .newext を上書きしない
-v: 詳細
-n: ドライラン