前書き
自動化Script作成時に、Bash (Shell Script)ではなく、RubyやPython3を用いた方がScriptのメンテナンス負荷が低くなります。自動化Scriptに使用するプログラミング言語変更を目的として、各言語の実装を比較します。
本記事では、「新規ディレクトリの作成方法」および「ディレクトリ削除方法」を比較します。比較では、実装例および実行例をそれぞれ示します。
Bashではなく、RubyやPython3を使った方が好ましい理由は、以下の記事に記載しています。この記事には、各プログラミング言語の様々な実装(ディレクトリ操作やファイル操作など)を比較した他記事へのリンクを一覧にまとめています。
各言語のVersion
- Bash:GNU bash, バージョン 5.0.3(1)-release
- Ruby:ruby 2.5.5p157 (2019-03-15 revision 67260)
- Python:Python 3.7.3
比較:「新規ディレクトリの作成方法」および「ディレクトリ削除方法」
自動化Scriptでは、設定ファイル保存用のディレクトリを作成したり、一時保管場所としていたディレクトリを削除する機会が多いです。
以下に、各言語の実装例および実行例を示します。
Bashの場合
#!/bin/bash
# -pオプション:親ディレクトリ含めて新規ディレクトリを作成する。
echo "新規ディレクトリ(new_dir/child_dir)を作成します。"
mkdir -p new_dir/child_dir
echo "ディレクトリ作成の確認をします。"
tree
echo "---"
# -rオプション:ディレクトリとディレクトリ内部にあるファイルを削除する。
# -fオプション:確認無しで、強制的にファイルを削除する。
echo "ディレクトリ(new_dir)を削除します。"
rm -rf new_dir
echo "ディレクトリ削除の確認をします。"
tree
Rubyの場合
#!/usr/bin/env ruby
require "fileutils"
puts("新規ディレクトリ(new_dir/child_dir)を作成します。")
FileUtils.mkdir_p('new_dir/child_dir')
# system()は、外部コマンド(例:/bin以下のバイナリ)を実行する。
puts("ディレクトリ作成の確認をします。")
system('tree')
# Dir.rmdir() :空のディレクトリを削除する場合に使用する。
# FileUtils.rm_r() :再帰的にディレクトリの削除を行う。
# FileUtils.rm_rf():再帰的にディレクトリを"強制的"に削除する。
puts("---")
puts("ディレクトリ(new_dir)を削除します。")
FileUtils.rm_rf('new_dir')
puts("ディレクトリ削除の確認をします。")
system('tree')
Pythonの場合
#!/usr/bin/env python3
import os
import subprocess
import shutil
print("新規ディレクトリ(new_dir/child_dir)を作成します。")
os.makedirs('new_dir/child_dir')
# subprocess.run()は、外部コマンド(例:/bin以下のバイナリ)を実行する。
print("ディレクトリ作成の確認をします。")
subprocess.run('tree')
# os.rmdir() :空のディレクトリを削除する場合に使用する。
# shutil.rmtree():再帰的にディレクトリの削除を行う(削除確認なし)。
print("---")
print("ディレクトリ(new_dir)を削除します。")
shutil.rmtree('new_dir')
print("ディレクトリ削除の確認をします。")
subprocess.run('tree')
Bash、Ruby、Python3の実行例
$ ./bash.sh
新規ディレクトリ(new_dir/child_dir)を作成します。
ディレクトリ作成の確認をします。
.
├── bash.sh
├── new_dir
│ └── child_dir
├── python.py
└── ruby.rb
2 directories, 3 files
---
ディレクトリ(new_dir)を削除します。
ディレクトリ削除の確認をします。
.
├── bash.sh
├── python.py
└── ruby.rb
0 directories, 3 files
$ ./ruby.rb
新規ディレクトリ(new_dir/child_dir)を作成します。
ディレクトリ作成の確認をします。
.
├── bash.sh
├── new_dir
│ └── child_dir
├── python.py
└── ruby.rb
2 directories, 3 files
---
ディレクトリ(new_dir)を削除します。
ディレクトリ削除の確認をします。
.
├── bash.sh
├── python.py
└── ruby.rb
0 directories, 3 files
$ ./python.py
新規ディレクトリ(new_dir/child_dir)を作成します。
ディレクトリ作成の確認をします。
.
├── bash.sh
├── new_dir
│ └── child_dir
├── python.py
└── ruby.rb
2 directories, 3 files
---
ディレクトリ(new_dir)を削除します。
ディレクトリ削除の確認をします。
.
├── bash.sh
├── python.py
└── ruby.rb
0 directories, 3 files
