すべてのファイルにファイル拡張子を再帰的に追加する


106

ファイル拡張子のないファイルを含むいくつかのディレクトリとサブディレクトリがあります。.jpgこれらのディレクトリに含まれるすべてのファイルに追加したいと思います。ファイル拡張子を変更するだけでなく、ファイル拡張子を追加するためのbashスクリプトを見てきました。それはまた再帰的である必要があります、誰かが助けてくれますか?

回答:


228

明示的なループのない代替コマンド(man find):

find . -type f -exec mv '{}' '{}'.jpg \;

説明:これ-type fにより、現在のディレクトリ(.)から始まるすべてのファイル()が再帰的に検索され、それぞれに移動コマンド(mv)が適用されます。また、{}スペースを含むファイル名(および改行も)が適切に処理されるように、を囲む引用符にも注意してください。


7
特に、ディレクトリ構造に非常に多くのファイルがある場合、これはうまく機能します(bashが反復するファイルのリストの長さに不満を感じる原因になります)。
DrAl 2009

@Al、forファイルのリストを反復するためにループ動揺bashを参照する場合、それは正しくありません。bash forループは、各mvコマンドを繰り返し発行します。
NIK

質問:ステートメントを実行する前にfind、最初にファイルのリストを設定しますか?私はそう思うが、無限ループをコーディングする前にこの点を明確にしたい。-exec
Boldewyn 2009

2
このコマンドは、拡張子を持つファイルも検索します。それはOPが望んでいることですか?
ghostdog74

1
@ ghostdog74:彼がこの答えを受け入れたので、上記は明らかにトリックをしました。それ以外の場合は、以下で説明するように、追加-not -name "*.*"するとうまくいきます。
Stephan202 2009

62

これは拡張子のないファイルを見つけ、.jpgを追加します

find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;

これにより、99%の確率で望ましい結果が確実に得られます。+1
2015

9

これは少し遅れますが、これまでの解決策よりも優れた解決策(読みにくいかもしれませんが)を追加したいと思いました。

find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/'

find | xargsファイルごとに新しいプロセスをフォークする必要がないので、パターンを使用すると、通常、より効率的な実行になります。

これには、従来の名前変更ではなく、Debian風味のディストリビューション(別名、プレネーム)にある名前変更のバージョンが必要であることに注意してください。ただし、これは非常に小さなperlスクリプトなので、どのシステムでも上記のコマンドを使用するのは簡単です。


4

このような、

for f in $(find . -type f); do mv $f ${f}.jpg; done

私はあなたがスペースで区切られたファイル名を持っていることを期待していません、
もしそうなら、名前は少し処理される必要があります。

あなたには、いくつかの他のディレクトリからコマンドを実行したい場合、
あなたは置き換えることができfind .find /target/directory


1
これには「do」が欠落しており、ファイル名にスペースが含まれている場合は、ファイル名を引用符で囲む方がよい場合があります。mv "$ f" "$ {f} .jpg"; 完了
DrAl、2009

そしておそらく私はそれをトップレベルのディレクトリ内から実行しますか?
robjmills 2009

@seengee:はい。このコマンドでもダッシュが欠落していることに注意してください-type
Stephan202 2009

私はどこかに行かなければならず、入力が速すぎました...今修正中
nik 07/10/10

1

Windowsベーシックで拡張子のないすべてのファイルの名前を変更するには、次のようにします。ファイルは拡張子がないren * *.jpg ため、*を使用するか、pngをjpgに変更する場合は、ren *.png *.jpg


0

rename

それが拡張子なしでファイルの名前を変更できるかどうかわからない(私は現在Windows 7にいます)


1
できますが、ディレクトリの名前も変更され、サブディレクトリで再帰的に動作するように指示する方法はありません(少なくともUbuntuで使用しているバージョンでは)。
ミロド

私は少なくとも2つの異なるコマンドを知っていますrename。1つはutil-linux-ngに含まれるCプログラム、もう1つは私たちの大学のDebianマシン上のPerlプログラム(Wall自身)です。実際、どちらも再帰を行いません。
Boldewyn 2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.