Ruby Script 基本檔案操作


Ruby除了web以外,最常使用的部份應該就是寫腳本語言(scripting),不外乎是一些程式自動化、佈署、系統優化等工作。各種系統管理人員的職缺都會要求至少會一種scripting語言,除了基本的bash以外,perl、python、ruby都是很常見的選擇。

雖然本人主要是開發Web,但最近接觸一些Ruby的scripting覺得很有趣,跟大家分享一些基本指令。

Ruby Script 執行

系統如果有安裝Ruby,就直接在terminal底下新增.rb結尾的新檔,要執行時直接輸入ruby filename.rb即可。

檔案新增、修改、刪除

Ruby當中最主要掌管檔案的是FileDirFileUtils這三個class,在RubyDoc上都有非常詳盡的解說。不過也因為太詳盡了,這邊簡單說明幾個最常用的。

1. 新增、寫入

# 只要把以下keyword的地方替換,就可以新增、編輯檔案,並寫入內容
File.new("檔案名稱", "變數")
File.open("檔案名稱", "變數") {|file| file.write("內容")}
# 後方的變數三個最常用的,如果你是新增檔案的話,不管哪個變數都沒差:
# "w":若有檔案則打開原檔,清空內容,從頭開始寫入。
# "a":若有檔案則打開原檔,將內容加在最後面。
# "r":若有檔案則打開原檔,將內容加在最前面。

# 打開一個"package.json"並寫入一個JSON物件
File.open("package.json", "w") {|file| file.write("{'hello': 'world'}")}

2. 讀取

# 將內容讀取至content變數當中
content = File.read("檔案名稱")


# 組合技:從一個檔案讀取特定內容,寫到另一個檔案當中
require 'json'
content = File.read("package.json")
object = JSON.parse(content)
File.open("file.txt", "r") { |file| file.write("Article Title: " + object["title"] + "\n") }
# 只插入title屬性至txt檔案第一行

3. 刪除

require 'fileutils'
# 一般Ruby並不需要特別require 'fileutils',如果是在irb之類的環境才要執行。

FileUtils.remove "filename.txt"

4. 指定路徑

# 一般來說我們不一定在哪個地方執行檔案,所以有時需要使用絕對路徑
File.read("~/path/to/the/file.txt")

# 有時我們也不知道檔案在哪,需要相對路徑
File.expand_path("file.txt")
# => "/Users/Motion Express/path/to/the/file.txt"

# 不過File.expand_path有一個很弔詭的地方,就是他吃兩個參數
# 如果只有一個參數,就只列出該檔案的絕對路徑
# 不過如果有兩個參數,他就會先讀取第二個檔案的絕對路徑,接著從該檔案開始讀取第一個參數的路徑
File.expand_path("sub-folder/index.html.erb", "folder/Gemfile")
# => 他會先抓取第二個參數,先讀出: 
# => "/Users/Motion Express/path/to/folder/Gemfile"
# => 接著才從這個Gemfile開始抓第一個檔案的位置: 
# => "/Users/Motion Express/path/to/folder/Gemfile/sub-folder/index.html.erb"

File.expand_path()補充資訊

5. 檔案資訊

# 判斷是檔案或資料夾
File.file? "file.txt"
# => true
File.directory? "file.txt"
# => false
File.file? "folder"
# => false
File.directory? "folder"
# => true

# 不存在的檔案一定都是false (僅判斷存在與否也可以使用exist?)
File.file? "no_such_file"
# => false
File.directory? "no_such_file"
# => false
File.exist? "no_such_file"
# => false

# 取得附檔名
File.extname("file.txt")
# => .txt

資料夾

檢視

# 目前所在的資料夾內容,回傳數列,其中數列前兩位的"."和".."是系統預設。
Dir.entries(".")
# => [".", "..", "file.txt", "folder"]

# 回傳上一層資料夾的內容
Dir.entries("..")
# 不是資料夾會產生錯誤
Dir.entries("no_such_folder")
# => Errno::ENONET: No such file or directory

編修

require 'fileutils'

# 單純的新增
Dir.mkdir("folder")
# 刪除
FileUtils.rm_rf("folder")
# 連同內容一起複製
FileUtils.copy_entry("folder", "another_folder")

# 組合計:在資料夾中只保留要的內容
wanted_files = ["package.json", "file.txt"]
Dir.entries("folder").each do |entry|
  if File.file? entry
    FileUtils.remove entry unless wanted_files.include? entry
  end
end

這樣基本的功能就都有了,可以用scripting來快速的到處編輯檔案囉!

圖片使用:PenDragon 1966