GNU ParallelによるBox CLIの強化
複数のBox CLIコマンドを同時に実行してワークフローの効率を高めようとしている方にお勧めの記事です。今回は、ジョブを並行して実行するための優れたツールであるGNU Parallelを使用して、Box CLIの操作を強化する方法について詳しく説明します。退屈な順次処理は止めて、タスクを迅速に実行できるようにしましょう。
GNU Parallelとは
GNU Parallelは、複数のジョブを並行して実行するためのシェルツールです。コマンドラインタスク向けのターボボタンがあるかのように、複数のジョブを同時に実行することで処理速度を向上します。速いだけではなく、柔軟性もあるため、並行して実行するジョブの数を制御したり、複雑なジョブの依存関係を処理したりできます。
GNU Parallelの設定
最初に、システム上でGNU Parallelを設定します。ここでは、さまざまなオペレーティングシステムでの設定方法を紹介します。
Ubuntu/Debianの場合:
sudo apt-get update
sudo apt-get install parallel
macOSの場合:
brew install parallel
CentOS/Fedoraの場合:
sudo yum install parallel
Windowsの場合:
Windowsユーザーの場合は、Cygwinが提供するUNIXのような環境でGNU Parallelを使用できます。以下に、簡単なガイドを示します。
- こちらからCygwinをダウンロードしてインストールします。
- インストール時に、必ず [Devel] カテゴリでparallelパッケージを選択してください。
インストールが完了したら、次のコマンドを実行してインストールを確認します。
parallel --version
GNU Parallelのバージョン番号が表示されます。
GNU ParallelとBox CLIの統合
Box CLIをインストール済みであれば、並列処理の力を利用する準備はほぼ整っています (インストールしていない場合は、インストール手順についてBox CLIのクイックスタートガイドを参照)。
入力ファイルの準備
GNU Parallelは、入力ファイルを使用すると驚くほど効果を発揮します。Boxアカウントに複数のファイルをアップロードする必要があるとします。ファイルごとに手動でコマンドを入力する代わりに、すべてのファイルパスをテキストファイルに列挙できます。
files-to-upload.txtという名前のファイルを作成し、アップロードする各ファイルパスを1行に1つずつ列挙します。
/path/to/file1.pdf
/path/to/file2.jpg
/path/to/file3.docx
並列コマンドの記述
次に、GNU Parallelを使用して入力ファイルから各行を読み取り、同時にBox CLIのアップロードコマンドを実行するコマンドを作成します。
parallel -j 10 box files:upload {} --parent-id 123456789 --name {/} :::: files-to-upload.txt
このコマンドの詳細は以下のとおりです。
- parallel: GNU Parallelを呼び出します。
- -j 10: 10個のジョブを並行して実行します。この数値は、CPUの処理能力やネットワーク帯域幅に基づいて調整してください。省略すると、GNU Parallelは、並行して実行できるジョブの数を自動的に判定します。
- box files:upload {} — parent-id 123456789 — name {/}: ファイルをアップロードするためのBox CLIコマンド。{} はファイル (ファイルパス) の入力行に置き換えられ、parent-idは、ファイルのアップロード先となるBox内のフォルダを示します。また、{/} により、アップロードされるファイルの名前として使用するファイルのベース名が抽出されます。
- :::: files-to-upload.txt: GNU Parallelの入力ファイルを指定します。このコマンドは、必ずこのファイルが存在するディレクトリから実行してください。
シンプルなテキストファイルの代わりに、データを管理しやすくするためにCSVファイルを使用することもできます。Box内のユーザーのごみ箱から複数の項目を削除する必要があるとします。その場合の入力ファイルを準備する手順を以下に示します。
- item_type、item_id、user_idという列を含むinput.csvという名前のCSVファイルを作成します。見出しは、並列コマンドの実行時に除外するか、awkを使用してスキップします。
item_type,item_id,user_id
file,100000000,0000001
folder,100000001,0000002
file,100000002,0000001
- awkを使用してこのCSVを処理し、GNU Parallelに渡します。
awk -F, 'NR > 1 {print $1 "," $2 "," $3}' input.csv | parallel -j12 --colsep ',' box trash:delete {1} {2} --as-user {3}
このコマンドの詳細は以下のとおりです。
- awk -F, ‘NR > 1 {print $1 “,” $2 “,” $3}’ input.csv: 見出しをスキップしてCSVを解析し、各行を出力します。
- parallel -j12 — colsep ‘,’ ‘box trash:delete {1} {2} — as-user {3}’: 12個のジョブを並行して実行します。{1}、{2}、{3}は、CSVの列を表すプレースホルダで、それぞれitem_type、item_id、user_idに対応しています。
コマンドの実行
ターミナルでこのコマンドを実行し、GNU Parallelによって複数のアップロードが同時に効率よく処理されるのを確認します。あたかも演奏者全員の演奏がぴったりと合っているオーケストラを指揮しているかのようです。ここでは各演奏者がクラウドにアップロードされる各ファイルに相当します。☁️
まとめ
Box CLIとGNU Parallelを併用することで、時間が節約されただけでなく、生産性を一変させるレベルの効率性も実現しました。大規模なデータセットの処理、定期的なバックアップの実行、一括ファイル操作の処理、多数のファイルの管理など、GNU ParallelとBox CLIの併用により、タスクは迅速かつ効率的に行われます。
GNU ParallelとBox CLIによる並列処理の力を利用すると、生産性が飛躍的に向上します。
Box CLIに関連した質問や知識共有が可能な、Box Developer Community (英語のみ) にご参加ください。🦄