ウェブサイト検索

ディレクトリ内のファイルをループするBashスクリプトは?


時には、私たちの要件に応じて、特定のフォルダー内のすべてのファイルとディレクトリを移動し、ループする必要があります。特定のコマンドをディレクトリ内の各フォルダーとファイルで実行したいとしましょう。その目的のために、ループを使ってすべてのディレクトリを反復します。複数のファイルに対して同じコマンドを実行することを許可するCLIユーティリティやコマンドラインユーティリティはわずかです。しかし、私たちの場合は、bashシェルスクリプトを使用し、forループを使って、作業を効率的にするために実行したい任意のコマンドを迅速に行います。

私たちのケースに限らず、全体のプログラミングにおけるループは非常に効率的で強力なアプローチであり、実践でもあります。ループを利用することで、最小限のコード量で複数のファイルやアイテムのグループに同じ概念を適用して、望ましい出力を得ることができます。bashでディレクトリやファイルをループするためには、「ワイルドカード」と呼ばれるグローバルパターンを使用します。これはすべてのファイルに一致する標準パターンです。しかし、コマンドの最後に「/」を追加することで、ディレクトリのみに一致させます。その後、利用可能な「dir」ディレクトリの値を各ディレクトリに割り当てます。最後に、ディレクトリをループ処理するためにechoコマンドを使用します。技術的には、このタスクを実行するために、まず変数を初期化し、次にループ処理したいデータセットをその変数に割り当てる必要があります。私たちのケースでは、「*」というワイルドカード文字を使ってディレクトリを循環させます。

構文 :

以下はディレクトリをループするための構文です。

for f in /folder/* folder/**/* ; do

instruction

done;

これにおいて、私たちは作成される「f」変数と共にforループを使用しています。これはforループが実行されるたびに実行されるアクションを定義しています。次に、それを通過するデータセットを定義した後、ファイルを取得するためのパスを定義するか、単にアスタリスク「*」を使用して、コンパイラが現在のディレクトリから取得できるようにします。私たちのケースでは、「folder」という名前の2つのパスを渡しました。「/folder/*」はフォルダー内のファイルを取得し、「folder/**/*」はそのサブフォルダーからファイルを取得します。

例1:

ディレクトリやファイルをループする方法を試して、その動作をよりよく理解します。そのために、まず現在使っているbashのバージョンを確認しましょう。ループを使用するにはバージョンを更新する必要があります。bashのバージョンを確認するために、以下のコマンドを実行します:

linux@linux-Virtualbox:~$ bash –version

現在私たちのシステムで実行されているbashのバージョンが以下のように表示されます。私たちのシステムでは「5.0,17」です。

ループを実行するために、最初にシステムに新しいディレクトリを作成し、その中にいくつかのファイルを追加します。新しいディレクトリを作成するために、次のコマンドを実行します:

linux@linux-Virtualbox:~$ mkdir Linux

上記のコマンドを実行した後、何も実行されず、単に端末をあなたに引き渡して、さらにコマンドを実行できるようになります。以下に示すように。

今、私たちのディレクトリが成功裏に作成されたかどうかを確認するために、システム内のファイルに移動し、ホームディレクトリの中に入ります。そこで「Linux」という名前のフォルダが作成されているのが見えます。なぜホームディレクトリでフォルダをチェックしているのかという疑問が生じるかもしれません。これは、私たちがパスを指定していないため、デフォルトでホームディレクトリに新しいフォルダやファイルが常に作成されるからです。

さて、そのためにLinuxディレクトリにファイルを作成する必要がありますので、まずは以下に示すように「cd」というコマンドを使ってLinuxディレクトリに移動します。

linux@linux-Virtualbox:~$ cd Linux

コマンドを実行した後、私たちのターミナルはこのようになります。

「echo」コマンドを使って、次のコマンドを実行することで、ダミーテキストを含む新しいファイルを作成します:

linux@linux-Virtualbox:~/linux$ echo “my new file 1” > myfile_a.txt

linux@linux-Virtualbox:~ /linux$ echo “my new file 1” > myfile_b.txt

linux@linux-Virtualbox:~ /linux$ echo “my new file 1” > myfile_c.txt

linux@linux-Virtualbox:~ /linux$ echo “my new file 1” > myfile_d.txt

私たちはLinuxディレクトリに「myfile_a」、「myfile_b」という名前の4つのファイルを作成しました。

"myfile_c" と "myfile_d" は、以下のスニペットで見ることができます。新しいファイルを作成する方法はいくつかあります。nanoテキストエディタを使う、catコマンドを使う、touchコマンドを使う、そして他にもたくさんの方法があります。echoを常に使用する必要はなく、好きなコマンドを使うことができます。

ファイルを作成したので、forループを使用してすべてのファイルを列挙する時が来ました。これを実行するために、別のコマンドを実行します。

linux@linux-Virtualbox:~ /linux$ for f in *; do echo $f; done

上記のコマンドでは、ループの実行時に行われるアクションを定義する変数「f」を作成しました。私たちのケースでは、以下のスニペットに示されているように、Linuxディレクトリに保存されているファイル名を表示しています。

上記のコマンドを使用することで、Linuxディレクトリに保存されているファイル名を表示しました。ファイル名と一緒に内容を表示したいと仮定すると、echoコマンドを何度も書く代わりにforループを使用することでも可能です。

linux@linux-Virtualbox:~ /linux$ for f in *; do echo $f; done

以下に示すように、すべてのファイルの内容が改行で区切られて表示されます。上記のコマンドでは、変数「f」を作成しましたが、同じ変数を作成する必要はありません。必要に応じて任意の変数を作成できます。「f」を使用することは必須ではありません。

結論

今日はディレクトリをループすることを学びました。ファイルをディレクトリから取得するために使用されるforループを紹介し、その作業についても説明しました。私たちは、最初に新しいディレクトリとファイルを作成し、その後、単純な例を使って「forループ」を利用してそれらにアクセスする方法を説明しました。