BUWに「rm -rf /」を実行すると……
UNIX/Linuxでは遊びでも実行してはいけないコマンドがある。それが「rm -rf /」だ。ファイルやディレクトリ(フォルダー)を削除するrmコマンドに、"再帰的"を意味するオプション「-r」、"強制"を意味するオプション「-f」。そして対象としてルートディレクトリを指している。つまり、「ルートディレクトリからすべてのファイルやディレクトリを削除する」というものだ。多くのrmコマンドは、ルートディレクトリーを削除対象としない「--preserve-root」が有効になっているため、上記コマンドを実行してもコマンドが実行されることはない。強制的に実行するにはオプション「--no-preserve-root」が必要だ。
興味深いのはBUW(Bash on Ubuntu on Windows)上での動作ではないだろうか。結論から述べれば、決して実行してはいけない。一見すると「アクセス制限で削除できないファイルばかりだから安全」「WSL(Windows Subsystem for Linux)上のファイルシステムはイメージだから……」と誤った考えをお持ちだろう。だが、BUWから見るルートディレクトリはCドライブを「/mnt/c」として含んでいるため、Cドライブの内容も大半が削除されてしまう。
コマンド終了後はデスクトップフォルダーなどもキレイに削除されたものの、PCを再起動すると意外にも問題なく起動した。ユーザーフォルダー内で削除されたデスクトップなどのフォルダーも自動復元される(もちろん中身は空だ)。しかし、スタートメニューやアクションセンターは応答しなくなり、実質的にWindows 10の「設定」から初期状態に戻す必要があるだろう(設定の起動は確認した)。もちろんオプション「--no-preserve-root」を付けていると同時に、マウント構造を頭に思い浮かべれば当たり前の結果である。繰り返し述べるが、「rm -rf /」はBUWでも実行してはいけない。
BashでExcelブックをPDFファイルに変換する
さて、Excel 2016はPDF出力機能を備えている。さらに述べればWindows 10はPDF出力を可能にする仮想プリンタードライバーを単独で用意しているため、電子ドキュメントに関する処理は決して難しくない。だが、大量のExcelブックを個別に変換するのは一苦労だ。
そこで作成したのが今回のシェルスクリプトである。いつもどおりお使いの環境に合わせて変数の値を変更し、シェルスクリプトに実行権限を与えてからお試し頂きたい。なお、今回のシェルスクリプト実行にはパッケージ「libreoffice」が必要なため、「sudo apt-get install libreoffice」と実行して同パッケージをインストールしてほしい。
#!/bin/bash
BaseDir=/mnt/c/Users/kaz/Desktop
FileDir=$BaseDir/Test
cd $FileDir
for File in $(ls *.xlsx); do
libreoffice --headless --nologo --convert-to pdf $File
done
ご覧のとおり極めてシンプルなシェルスクリプトである。今回インストールした「LibreOffice」はOSS(オープンソースソフトウェア)のOpenOffice.orgから派生したオフィススイートだ。Linuxディストリビューションの多くがGUI環境で使用するオフィススイートとして採用しているが、コマンドラインオプションを組み合わせることで変換ツールとして利用できる。
ご覧のとおり処理の中核は8行目。事実上のワンライナーシェルスクリプト(1行で書けるシェルスクリプト)だ。xargsコマンドを組み合わせればワイルドカードを引数として与えられるため、1行で書ける内容である。だが、本連載はコマンドラインの操作に不慣れなWindows利用者を対象にしているため、シェルスクリプトの形式を取った。
なお、今回はExcelファイルを対象としているが、Word文書ファイル(拡張子「.doc」「.docx」)や、PowerPointプレゼンテーションファイル(拡張子「.ppt」「.pptx」)にも対応している。OfficeとLibreOfficeの互換性問題から、部分的にデータが欠落することもあるが、この辺りは目をつぶるほかない。
阿久津良和(Cactus)