web-dev-qa-db-ja.com

複数のファイルの拡張子を変更するにはどうすればよいですか?

ファイル拡張子を*.txtから*.textに変更したいと思います。 basenameコマンドを使用してみましたが、複数のファイルを変更できません。

これが私のコードです:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done

私はこのエラーを受け取ります:

basename: too many arguments Try basename --help' for more information
192
afbr1201

GregのWikiから直接

#すべての* .txtの名前を* .txtのfの* .text 
に変更します。 do 
 mv-"$ f" "$ {f%.txt} .text" 
 done 

また、なぜあなたが _ls を解析できないのかについてのエントリも参照してください。

編集:basenameを使用する必要がある場合、構文は次のようになります。

 * for。* for f; do 
 mv-"$ f" "$(basename-" $ f ".txt).text" 
完了
211
jasonwryan

これが、Debianの現在のディレクトリにあるすべてのファイル拡張子を変更する方法です。

rename "s/oldExtension/newExtension/" *.txt

(これはPerlのrenameコマンドであり、util-linuxのコマンドではありません。 Debian/Ubuntuの名前変更ユーティリティが、CentOSなどの他のディストリビューションのものと異なるのはなぜですか?

157
Matthias Braun

シンプルなコマンド rename from util-linux 、それを行います。「*。txt」に一致するすべてのファイルで「txt」のすべての出現箇所を「text」に置き換えます。

rename txt text *.txt
43
lamwaiman1988
rename "s/oldExtension/newExtension/" *.txt

上記は正常に動作しますが、現在のディレクトリに限定されます。以下のコマンドを試してみてください。これはサブディレクトリで柔軟です。すべての名前を変更します.txtディレクトリ構造の下の新しい拡張子を持つファイル。

find . -name "*.txt" -exec rename 's/.txt$/.newext/' {} \;
31
Rahul

s/oldExtension/newExtension/に関するここでの回答は誤りです。 s/txt/text/を使用する場合は、footxt.txtfootext.txtに変換することになりますが、これは目的とは異なります。 s/.txt/.text/を使用しても、footxt.txtfo.text.txtに変換されます。

ピリオドに一致させるには、\.を使用する必要があります(.は任意の文字に一致します)。そして、末尾の$は行末に一致します。これだけが適切に拡張子と一致します。

rename 's/\.txt$/.text/' *.txt

rename 's/\.old$/.new/' *.old
12
wisbucky
for f in *.txt
do
    [ -f "$f" ] && mv "$f" "${f%txt}text"
done
9

@Prince John Wesleyの回答に基づいて、現在のディレクトリにあるファイルのすべての拡張子をext1からext2に変更するための簡単なbashスクリプトを次に示します。名前を変更するファイルの名前も出力します。

#!/bin/bash
for f in *.$1
do
    [ -f "$f" ] && mv -v "$f" "${f%$1}$2"
done

使用例(スクリプトの名前がchange-extであると想定):

change-ext ext1 ext2
8

Zshに切り替える理由#53:

zmv '(*).txt' '$1.text'

7
Burrito

ファイルがさまざまなディレクトリに分散しているとしましょう。dirxが親ディレクトリであると仮定すると、これはfindを使用してジョブを実行できます。

for f in `find /dirx -iname '*.txt' -type f -print`;do  mv "$f" ${f%.txt}.text; done
6
Arash

これは私にとってうまくいきます:

find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;
2
yegor256

あなたが

ソースファイルの拡張子がありません

ターゲットの拡張子は。textこのようにします-

for f in *; do mv -- "$f" "${f%.\*}.text"; done
2
nitinr708

バージョンの問題点を知りたい場合:basenameコマンドで$filesではなく$xを使用しました。したがって、これは機能するはずです(ただし、テストされていません)。

for x in *.txt
do
  mv "$x" "`basename '$x' .txt`.text"
done
1
daniel kullmann