シェルスクリプトのforループでフォルダやファイルを一括処理のイメージ画像

シェルスクリプトのforループでフォルダやファイルを一括処理

  • 公開日:2018/08/04
  • 更新日:2018/10/19
  • 投稿者:n bit

ディレクトリ内の全てのフォルダやファイルに対してシェルスクリプトのforループを回し一括でコマンドを実行していく方法を解説します。フォルダやファイルの数が多いものに対して手動で実行していくと大変時間がかかりますので効率化しましょう。

  • 効率化

この記事は約 分で読めます。(文字)

シェルスクリプトでフォルダやファイルを一括処理する方法

シェルスクリプトでコマンドを実行するときにフォルダ単位やディレクトリ内の全ファイルに対して一括で処理を行いたい場合はforループを使うことで実行できます。

カレントディレクトリ内のファイル一覧とディレクトリ一覧を配列で取得

まずは一括処理を行いたいカレントディレクトリ内のフォルダやファイルの一覧を配列で取得します。取得した配列データをforでループさせて確認してみましょう。

まずはシステムへ今からシェルスクリプトを記述しますと知らせるために、お約束の1行を用意します。

#!/bin/sh

forループの基本的な記述方法

次にforループの処理です。forループの基本的な記述方法は以下のようになります。配列データを格納した変数$arrayからデータを1つずつ取得し変数iに格納してループさせています。

for i in $array;

do
実行する処理内容
done

findでフォルダやファイルの一覧を取得

フォルダやファイルの一覧を取得するにはディレクトリ内のファイルを検索するfindコマンドを利用します。

dir_path="/Users/〇〇/Documents/test/*"

find $dir_path
-typeオプション

フォルダのみ検出するか、ファイルのみ検出したい場合は-typeオプションを利用します。-typeオプションは検索の対象とするファイルタイプを指定するためのものです。ディレクトリを指定したい場合はd、ファイルを指定したい場合はfを指定してください。

# ディレクトリを指定

find $dir_path -type d

# ファイルを指定
find $dir_path -type f
-maxdepthオプション

サブディレクトリやサブディレクトリ内のファイルの検出を除外したい場合は-maxdepthオプションを利用します。-maxdepthオプションは検索するディレクトリの深さを指定するもので、0から32767まで指定することができます。最初の階層内のみ検索に含めたい場合は0を指定してください。

find $dir_path -maxdepth 0
-nameオプション

検索対象を名称でフィルタリングしたい場合は-nameオプションを利用します。-nameオプションはディレクトリー名やファイル名を検索するオプションでワイルドカードを使用することができますので名称の1部を利用してフィルタリングすることが可能です。

-nameに続けて検索対象にしたい名称を入力します。拡張子にjpgを持つファイルのみ検索対象にする場合は下記のような記述になります。

find $dir_path -type f -name *.jpg

指定ディレクトリ内のファイルに一括処理を行う時の完成形サンプルコード

指定したディレクトリ内のファイルに対して一括処理を行うときのベースとなるサンプルコードは下記のようになります。実行処理を行うところでechoを使ってファイルまでのフルパスを出力しています。実行処理を記述する部分に一括処理させたい処理内容を記述して使ってください。

#!/bin/sh


dir_path="/Users/〇〇/Documents/test/*"
dirs=`find $dir_path -maxdepth 0 -type f -name *.jpg`

for dir in $dirs;
do
echo $dir
# ここから実行処理を記述
done

指定ディレクトリ内のフォルダに一括処理を行う時の完成形サンプルコード

指定したディレクトリ内のフォルダに対して一括処理を行いたい場合のベースとなるサンプルコードは下記のようになります。こちらも実行処理を行うところでechoを使ってフォルダまでのフルパスを出力しています。実行処理を記述するところに一括処理させたい処理内容を記述して使ってください。

#!/bin/sh


dir_path="/Users/〇〇/Documents/test/*"
dirs=`find $dir_path -maxdepth 0 -type d`

for dir in $dirs;
do
echo $dir
# ここから実行処理を記述
done

今日のdot

指定ディレクトリ内のフォルダやファイルに対して一括処理を行いたいケースはよくあります。例えば一括で名称変更を行いたい場合や、指定名称を含むファイルの一括削除、指定名称を含むファイルの一括コピーなど、対象となるファイル数が多いときには手動でやると非常に時間かかってしまいますので今回のような一括処理できるシェルスクリプトを積極的に活用して作業を効率化していきましょう。