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;
上記のスクリプトは、メイン ディレクトリとサブディレクトリからすべてのファイルを削除します。 コマンドでファイルのみが選択されているため、フォルダーは削除されません。 出力を参照してください。
Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.
LinkedIn Facebook