質問
ディレクトリでは、私を信じてチーム *.html
ファイルです。私の名前を変更してき *.txt
する方法を教えてください。使っているbashシェルです。
解決
のためのより良いソリューション(みbashの機能と外部への通話)、 その他の回答.
以下のいを必要としないシステムの 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%.txt}.txt_bak"' {} \;
rename
を使用する場合:
rename -S .html .txt *.html
これはまさにあなたが望むことをします- *。html
に一致するすべてのファイルの拡張子を .html
から .txt
に変更します。
注:Greg Hewgillは、これがbashビルトインではないことを正しく指摘しています。また、別個のLinuxコマンドです。 Linuxで何かが必要な場合は、これで十分です。よりクロスプラットフォームなものが必要な場合は、他の答えをご覧ください。
Macの場合...
- 名前を変更していない場合:
brew install rename
-
rename -S .html .txt * .html
Ubuntuユーザーの場合:
rename 's/\.html$/\.txt/' *.html
名前変更コマンドの例を次に示します。
rename -n ’s/\.htm$/\.html/’ *.htm
-nは、テスト実行であり、実際にファイルを変更しないことを意味します。 -nを削除すると名前が変更されるファイルのリストが表示されます。上記の場合、現在のディレクトリ内のすべてのファイルを.htmのファイル拡張子から.htmlに変換します。
上記のテスト実行の出力に問題がなければ、最終バージョンを実行できます:
rename -v ’s/\.htm$/\.html/’ *.htm
-vはオプションですが、以下の出力例に示すように、名前変更コマンドによって行われた変更の唯一のレコードであるため、含めることをお勧めします。
$ 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の置換です。
<*>他の人の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&quot; {}。{txt、html}&quot;
- find がファイル名として{}を渡すと、$ {filename%。*}は拡張子なしでベース名を抽出し、 mv へのパラメーターを形成します。 bash は{txt、html}を2つのパラメーターとして書き換えるため、最終コマンドが次のように実行されるようにします。 mv -iv&quot; filename.txt&quot; &quot; filename.html&quot;
ただし、修正が必要:ファイル名のスペースの処理
この問いを明示的に記載BashのだというZSH可能でのインターネットはモバイル:
zmv '(*).*' '$1.txt'
に取得する場合 zsh: command not found: zmv
それだけ実行します:
autoload -U zmv
して、再度入力してください。
この 原著論文 のための先端につzmv.
これは、私が見つけた最も滑らかなソリューションであり、OSXおよびLinuxで動作し、gitでもうまく動作します!
find。 -name&quot; *。js&quot; -exec bash -c 'mv&quot; $ 1&quot; &quot; $ {1%.js}&quot; .tsx '-' {} '\;
およびgitを使用:
find。 -name&quot; *。js&quot; -exec bash -c 'git mv&quot; $ 1&quot; &quot; $ {1%.js}&quot; .tsx '-' {} '\;
コマンド mmv
は、このタスクを非常に効率的に実行するようです。膨大な数のファイル(1秒間に数万)。たとえば、すべての .xml
ファイルの名前を .html
ファイルに変更するには、次を使用します:
mmv ";*.xml" "#1#2.html"
;
はパスと一致し、 *
はファイル名と一致し、これらは#1
およびと呼ばれます置換名の#2
。
exec
またはパイプに基づく回答は、非常に多くのファイルで遅すぎるか失敗しました。
これを試してください
rename .html .txt *.html
使用法:
rename [find] [replace_with] [criteria]
パーティーに少し遅れました。あなたは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を好む場合は、PERLの作成者であるLarry Wallによって書かれた短いPERLスクリプトがあります。 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
希望どおりに動作したら、エコーを削除します。
編集: expname
は一般により柔軟ですが、この特定のケースでは basename
がおそらく少し読みやすくなります。
これは、複数の拡張機能を一度に変更するのに適した方法です。
for fname in *.{mp4,avi}
do
mv -v "$fname" "${fname%.???}.mkv"
done
注:拡張サイズが同じになるように注意してください(???)
いい&amp;シンプル!
find . -iname *.html -exec mv {} "$(basename {} .html).text" \;
これは .edge
ファイルの名前を .blade.php
for file in *.edge; do mv "$file" "$(basename "$file" .edge).blade.php"; done
チャームのように動作します。
1行、ループなし:
ls -1 | xargs -L 1 -I {} bash -c 'mv $ 1&quot; $ {1%。*}。txt&quot;' _ {}
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$