2013-09-05 18 views
0

我試圖在ruby中創建一個腳本來讀取文件夾中的文件,並將它們合併到單個文件中。試圖將文件夾中的多個文件的內容追加到新文件

這是我想出

File.open('authorized_keys','a') do |mergedfile| 
    @files = Dir.glob('/home/<user>/ruby_script/*.keys') 
    for file in @files 
    text = File.open(file, 'r').read 
    text.each_line do |line| 
     mergedfile << line 
    end 
    end 
end 

的想法是,該腳本會從GitHub爲我們的開發人員下載公共密鑰文件,把它們合併成一個authorized_keys文件,我們會再scp將我們的雲服務器。

我遇到的問題是,當生成authorized_key文件時,一些ssh密鑰在新行中,一些與其他行在同一行。

我檢查下載的文件,每個關鍵是它自己的行

我怎樣才能確保每個關鍵是在它自己的路線?

感謝

回答

1

比上一個文件中的其他的線是肯定以一個結尾字符結尾(否則,它們不會被識別爲一行),所以你的問題是文件的結尾不一定是e ndline字符。爲了確保,行

text = File.open(file, 'r').read 

改變

text = File.open(file, 'r').read.sub(/#$/?\z/, $/) 
+0

+1,順便說一句,'/ \ n \ Z/「\ n」'如果你使用文本模式,因爲似乎更合適在文本模式下,'$ /'字符串將被轉換爲'「\ n」'。 – falsetru

+0

@falsetru我認爲你的意思是'/ \ n?\ z /'。這只是在UNIX上。 – sawa

+0

你說得對。我修正了這一點。 – falsetru

2

使用String#chomp刪除換行符,再加入新行("\n"$/):

"abc\n".chomp + "\n" # => "abc\n" 
"abc".chomp + "\n" # => "abc\n" 

mergedfile << line.chomp + "\n" 
3

這會更容易在命令行中使用cat完成。您可以輕鬆地將所有文件連接成一個文件。這是man cat在命令行:

The command: 

     cat file1 file2 > file3 

will sequentially print the contents of file1 and file2 to the file file3, 
truncating file3 if it already exists. See the manual page for your shell 
(i.e., sh(1)) for more information on redirection. 

你可以很容易地從文件目錄中的一個陣列創建相應的命令,然後創建命令,並通過反引號或在一個子shell執行它%x命令。

喜歡的東西:

require 'dir' 

files = Dir['/path/to/files.*'].select{ |f| File.file?(f) }.join(' ') 
`cat #{ files } > new_file` 

你原來的代碼可以更簡潔地寫爲:

File.open('authorized_keys','a') do |mergedfile| 
    Dir.glob('/home/<user>/ruby_script/*.keys').each do |file| 
    mergedfile.write(File.read(file)) 
    end 
end 

的差異(和問題),你的代碼是read聲明。這將整個文件拖入內存。如果該文件大於可用內存,程序將停止。厲害。有辦法解決,使用的foreach代替read,如:

File.open('authorized_keys','a') do |mergedfile| 
    Dir.glob('/home/<user>/ruby_script/*.keys').each do |file| 
    File.foreach(file) do |li| 
     mergedfile.write(li) 
    end 
    end 
end 
相關問題