bashを使用してファイルにファイル拡張子を追加する


93

bashで拡張子のないファイルにファイル拡張子「.jpg」を追加する良い方法は何ですか?


3
mv "${file}" "${file}.jpg"
onteria_

2
あなたの考えでは、「拡張子のないファイル」とは何ですか?名前にドットが含まれていないファイルですか?
グレン・ジャックマン、

回答:


116
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done

8
2つ目は、拡張子のないファイルの名前を変更するのに最適です!ありがとう!
anon58192932 14

2
2つ目は、拡張子のないファイルだけでなく、すべてのファイルに拡張子を追加する
Jeff

5
メモ"${f%.jpg}"と同じように、bashシェルの文字列操作です。`$ {string%substring}` $ substringの最短一致を$ stringの後ろから削除します。
Jichao

警告:拡張子が混在するフォルダがある場合は、上記が.jpg通常のファイルにも追加されることを知っておいてください。
sachinruk

61

名前の変更を使用できます。

rename 's/(.*)/$1.jpg/' *

3
どのバージョンの名前変更を使用していますか?鉱山は異なる引数を持っている:rename from to file...
B・ジョンソン

1
renameはバージョン5.10.1のperlに含まれています。
Kim Stebel

3
これは、Ubuntuに含まれている名前変更(つまり、すべてのDebianベースのディストリビューションを推測している)でうまく機能し、jm666の回答よりもはるかに簡潔です。
ロジャーヒースコート

28

別の方法-ループなし

find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep  'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg

壊す:

  • 拡張子なしですべてのファイルを見つける
  • ファイルの種類を確認する
  • JPGファイルのみを除外
  • ファイルタイプ情報を削除する
  • xargsは各ファイルに対して「mv」を実行します

上記のコマンドは、のためにあるドライランそれはあなたがMVの前に「エコー」を削除する必要があります後、

編集「パスの引数を引用符で囲む;スペースを含むパスでの引数の分割を回避 する必要があると示唆している人もいます。

通常、この推奨事項は当てはまりますが、この場合は当てはまりません。ので、ここでは%置き換えられましたされていないシェル拡張ではなくによってxargs内部的に(直接)、そう%であっても、ファイル名にスペースを正しく置換されます。

簡単なデモ:

$ mkdir xargstest
$ cd xargstest

# create two files with spaces in names
$ touch 'a b' 'c d'

$ find . -type f -print
./c d
./a b
# notice, here are spaces in the above paths

#the actual xargs mv WITHOUT quotes
$ find . -type f -print | xargs -I % mv % %.ext

$ find . -type f -print
./a b.ext
./c d.ext
# the result is correct even in case with spaces in the filenames...

これをループに入れると、このxargsは不要になります。私はこの状況でライアンの答えが好きです。
Lucius

1
@Lucius-ところで、質問は「拡張子のない」ファイルを必要とするので、Ryanはそれらだけを見つける必要があります...
jm666

@ jm666こんにちは!フォルダー内のすべての拡張子のないファイルの名前をそれぞれの拡張子に変更するようにコードスニペットを変更する方法 (file -b $ filenameコマンドで正しい拡張子を検出しています。)
Soumyajit

24

シンプルで、ファイルがあるディレクトリにcdします。

for f in *;do mv $f $f.jpg;done

何らかの理由でこれは私にはうまくいきますが、引用のあるSethの解決策はうまくいきません。(OSXマウンテンライオンbash)
delrocco

4
for f in *;do mv "$f" "$f".jpg;doneファイル名のスペースをサポートするために使用された方が良いでしょう。
Hritik 2017年

このエレガントでシンプルなソリューションに感謝します-私は何度もこの回答にたどり着きましたが、覚えられないようです。#dejavu
Tim Andersen、


6
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;

1

私が使用して私の場合は、ファイルタイプを認識していませんでしたMVの助けを借りて、コマンドをファイル調べ、おそらく、ファイルの種類を見つけるためのコマンド。fileコマンドはファイルタイプを認識しない可能性があるため、この解決策はすべてのファイルに完全ではないかもしれませんが、私にとってはほとんどうまくいきました。

for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done

awkの使用は、実際に拡張子であるコマンドファイルから返される文字列の2番目の単語を取り除くことです。


jpgとpngを自動的に処理します。それを使用して動作しました-どうもありがとう!現在、拡張子はCAPSのみです。しかし、小さな問題:)
krivar


0

あなたは使用することができ、複数のファイルを移動します。私はこのプロジェクトのメンテナーです。構文は簡単です。

mmf files*

$ EDITORを開き、すべてのファイル名、またはデフォルトでvimを開きます。vimでCtrl + v + Gを使用してすべてのファイル名の終わりを強調表示し、ファイルを保存して終了すると、すべてのファイルの名前が変更されます


-2

ライアン・リー

ファイル拡張子のないディレクトリ内の複数のファイルにファイル拡張子を追加するための正しい構文は次のとおりです。

find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then  mv "$FILE" "$FILE".eml; fi; done;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.