Bashを使用してファイルに拡張子を追加する
1. 概要
場合によっては、多数のファイルの拡張子を修正する必要があります。 bashは、比較的簡単にそれを達成するのに役立つ優れたツールです。
このチュートリアルでは、これをすばやく正確に行う方法を見ていきます。
2. シンプルループ
特定のディレクトリ内のすべてのファイルに無差別に拡張子を追加する必要がある場合は、単純なforループとmvコマンドを使用して次の操作を実行できます。
$ for f in *; do mv "$f" "$f.jpg"; done
このソリューションは非常に簡潔ですが、いくつかの欠点があります。 一部のファイルにすでに拡張子が付いている場合はどうなりますか? または、一部のファイルが修正したいタイプではない可能性がありますか? これらの問題に次々と対処していきます。
3. 拡張子のないファイルの選択
実生活では、 1つのディレクトリにさまざまなファイルを含めることができます。そのうちのいくつかは処理したいもので、他のファイルはそのままにしておきたいものです。
ディレクトリに“ picture.jpg”と“ image”の2つのファイルがあるとします。もちろん、2番目の“。jpgを追加したくありません。 ”最初のファイルの拡張子。
find コマンドを使用して、正しいファイルを選択します。
$ find . -not -name "*.*"
./image
次に、-execパラメーターとmvコマンドを使用して、返されたファイルの名前を変更できます。
$ find . -not -name "*.*" -exec mv {} {}.jpg \;
オプションで、単純なwhileループを使用できます。
$ find . -not -name "*.*" | while read FILE; do mv "$FILE" "$FILE".jpg; done
4. ファイルの種類で区別する
私たちのシナリオはさらに複雑になる可能性があります。 拡張子がなく、JPEGではないファイルが発生する可能性があります。ディレクトリもLinuxのファイルであり、処理するネストされたディレクトリが存在する可能性があることに注意してください。 したがって、ディレクトリに入る必要がありますが、名前を変更する必要はありません。
「picture.jpg」、「image」、「readme」、
幸い、findコマンドはネストされたファイルも一覧表示します。 ディレクトリを除外する場合は、–typeパラメータを使用する必要があります。
$ find . -type f -not -name "*.*"
./image
./readme
./nested_directory/another_image
ファイルの実際のタイプを確認するには、ファイルコマンドを使用します。
$ echo "test" > readme
$ file --mime-type -b readme
text/plain
$ file --mime-type -b image
image/jpeg
$ file --mime-type -b nested
inode/directory
最後に、 while ループを条件付きステートメントとともに使用して、ファイルを反復処理します。
find . -type f -not -name "*.*" | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;
findコマンドの-execパラメーターを使用することもできますが、その場合は、bashまたはを使用して条件ステートメントを実行する必要があります。 sh コマンド:
find . -type f -not -name "*.*" -exec bash -c 'if [ $(file --mime-type -b {}) == "image/jpeg" ]; then mv {} {}.jpg; fi;' \;
コマンドが意図したとおりに動作することを確認するためにドライランを実行する場合は、mvコマンドをechoコマンドに置き換えるだけで、新旧を印刷できます。ファイル名。
5. 概要
このチュートリアルでは、Bashを使用して拡張子のないファイルに拡張子を正確に追加する方法を学びました。 すでに拡張子が付いているファイル、間違ったタイプのファイル、ネストされたディレクトリなど、考えられるさまざまな落とし穴を検討しました。