HOWTO · Bash

Bashでディレクトリを再帰的にループする

このチュートリアルでは、Bash でディレクトリを再帰的にループする方法を示します。

このページの内容

このチュートリアルでは、Bash でディレクトリを再帰的にループする方法を示します。

Bashでディレクトリを再帰的にループする

さまざまなディレクトリを操作しているときに、ディレクトリのループが必要になることがよくあります。 Bash を含むすべての Linux 端末で同様のコマンドを使用して、ディレクトリを再帰的にループできます。

まず、find コマンドを使用して、現在のディレクトリの構造を確認します。 find コマンドは、現在のディレクトリまたは指定されたディレクトリ内のすべてのファイルとフォルダーを表示します。

すべてのファイルを表示するには:

find . -type f -print0

特定のディレクトリのファイルを表示するには:

find /mnt/c/Users/Sheeraz/DemoFolder1 -type f -print0

/mnt/c/Users/Sheeraz/DemoFolder1 は、確認するディレクトリ パスです。 このディレクトリの構造は次のとおりです。

ディレクトリ構造

-type f オプションは、フォルダーではなく、そのディレクトリのファイルのみを取得するために使用されます。 このコマンドの出力は次のとおりです。

/mnt/c/Users/Sheeraz/DemoFolder1/Delftstack.java/mnt/c/Users/Sheeraz/DemoFolder1/delftstack.rtf/mnt/c/Users/Sheeraz/DemoFolder1/demo.bmp/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/Delftstack.java/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/delftstack.rtf/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/demo.bmp/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/Example1.java/mnt/c/Users/Sheeraz/DemoFolder1/Example1.java/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/Delftstack.java/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/delftstack.rtf/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/demo.bmp/mnt/c/Users/Sheeraz/D

ディレクトリのフォルダーも取得する場合は、上記のコマンドから -type f を削除します。

find /mnt/c/Users/Sheeraz/DemoFolder1 -print0

ファイル名の構造がわかったら、次のコードを使用してディレクトリを再帰的にループします。

for x in $(find /mnt/c/Users/Sheeraz/DemoFolder1 -type f -print0)
do
    echo $x;
done;

上記のコードは、ディレクトリ /mnt/c/Users/Sheeraz/DemoFolder1 を再帰的にループし、各ファイルの名前を echo します。 このコマンドの出力を参照してください。

/mnt/c/Users/Sheeraz/DemoFolder1/Delftstack.java/mnt/c/Users/Sheeraz/DemoFolder1/delftstack.rtf/mnt/c/Users/Sheeraz/DemoFolder1/demo.bmp/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/Delftstack.java/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/delftstack.rtf/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/demo.bmp/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/Example1.java/mnt/c/Users/Sheeraz/DemoFolder1/Example1.java/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/Delftstack.java/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/delftstack.rtf/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/demo.bmp/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/Example1.java

ディレクトリを再帰的にループして、特定の拡張子を持つファイルを取得する

ご覧のとおり、すべてのファイルを表示したり操作したりする必要はありません。 このコマンドを -name オプションとともに使用して、特定の拡張子を持つファイルを取得することもできます。

コマンドを参照してください。

for x in $(find /mnt/c/Users/Sheeraz/DemoFolder1 -type f -name '*.java');
do
    echo $x;
done;

上記のコードは、.java 拡張子を持つ /mnt/c/Users/Sheeraz/DemoFolder1 内のファイルのみを出力します。 出力を参照してください。

/mnt/c/Users/Sheeraz/DemoFolder1/Delftstack.java
/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/Delftstack.java
/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/Example1.java
/mnt/c/Users/Sheeraz/DemoFolder1/Example1.java
/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/Delftstack.java
/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/Example1.java

ディレクトリを再帰的にループしてファイルを別のディレクトリに移動する

Bash mv コマンドを使用してディレクトリを再帰的にループすることで、ファイルを移動することもできます。 このコマンドの構文は次のとおりです。

mv -v $filename $destination directory

このコマンドを再帰ループで使用して、ファイルを宛先ディレクトリに移動できます。 例を試してみましょう。

for x in $(find /mnt/c/Users/Sheeraz/DemoFolder1 -type f -name '*.java');
do
    mv -v $x /mnt/c/Users/Sheeraz/DemoFolder2
done;

DemoFolder2 は空のディレクトリです。

移動前の移動先ディレクトリ

出力:

renamed '/mnt/c/Users/Sheeraz/DemoFolder1/Delftstack.java' -> '/mnt/c/Users/Sheeraz/DemoFolder2/Delftstack.java'
renamed '/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/Delftstack.java' -> '/mnt/c/Users/Sheeraz/DemoFolder2/Delftstack.java'
renamed '/mnt/c/Users/Sheeraz/DemoFolder1/DemoFolder2/Example1.java' -> '/mnt/c/Users/Sheeraz/DemoFolder2/Example1.java'
renamed '/mnt/c/Users/Sheeraz/DemoFolder1/Example1.java' -> '/mnt/c/Users/Sheeraz/DemoFolder2/Example1.java'
renamed '/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/Delftstack.java' -> '/mnt/c/Users/Sheeraz/DemoFolder2/Delftstack.java'
renamed '/mnt/c/Users/Sheeraz/DemoFolder1/SubFolder/Example1.java' -> '/mnt/c/Users/Sheeraz/DemoFolder2/Example1.java'

引っ越し先ディレクトリ

ご覧のとおり、コマンドはディレクトリを再帰的にループし、拡張子 java を持つファイルを宛先ディレクトリに移動しました。

ディレクトリを再帰的にループしてファイルを削除する

rm -rf コマンドを使用して、指定したディレクトリからファイルを削除できます。 このコマンドの構文は次のとおりです。

rm -rf $filename

このコマンドを再帰ループに入れて、ディレクトリからすべてのファイルを再帰的に削除しましょう。

for x in $(find /mnt/c/Users/Sheeraz/DemoFolder1 -type f);
do
    rm -rf $x
done;

上記のスクリプトは、メイン ディレクトリとサブディレクトリからすべてのファイルを削除します。 コマンドでファイルのみが選択されているため、フォルダーは削除されません。 出力を参照してください。

ディレクトリからファイルを削除