2010-04-09 13 views
6

Ich bin einen Anfänger in Rubin und in der Programmierung als auch und muß mit Systemaufruf helfen, eine Datei von der Quelle zum Ziel, wie dies für die Bewegung:Systemaufruf in Ruby

system(mv "#{@SOURCE_DIR}/#{my_file} #{@DEST_DIR}/#{file}") 

Ist es möglich, dies zu tun in Rubin? Wenn ja, wie lautet die korrekte Syntax?

Antwort

11

system("mv #{@SOURCE_DIR}/#{my_file} #{@DEST_DIR}/#{file})

mit

system("mv", "#{@SOURCE_DIR}/#{my_file}", "#{@DEST_DIR}/#{file}")

, die die Chancen auf eine reduziert ersetzt werden Kommandozeilen-Injektion Angriff.

3
system("mv #{@SOURCE_DIR}/#{my_file} #{@DEST_DIR}/#{file}) 

sollte die richtige Anruf sein

9

Zwei Möglichkeiten

Empfohlene Weise

Sie können die Funktionen in der Datei Utils verwenden here libary sehen Sie Ihre Dateien

zB bewegen
mv(src, dest, options = {}) 


Options: force noop verbose 

Moves file(s) src to dest. If file and dest exist on the different disk 
partition, the file is copied instead. 

FileUtils.mv 'badname.rb', 'goodname.rb' 
FileUtils.mv 'stuff.rb', '/notexist/lib/ruby', :force => true # no error 

FileUtils.mv %w(junk.txt dust.txt), '/home/aamine/.trash/' 
FileUtils.mv Dir.glob('test*.rb'), 'test', :noop => true, :verbose => true 


Frech Weg

den Backticks Ansatz verwenden (eine beliebige Zeichenfolge als Befehl ausführen)

result = `mv "#{@SOURCE_DIR}/#{my_file} #{@DEST_DIR}/#{file}"` 

Ok, das ist nur eine Variation des System Befehl aufrufen, sieht aber viel unartiger!

+0

Ok, danke für alle Antworten. Wenn ich die Datei über das NFS-Dateisystem verschiebe und umbenenne, was passiert wirklich nach File.rename? Zieht File.rename die Datei in mein lokales Dateisystem und benennt sie um und drückt sie (zurück) zum Ziel oder macht sie den Umbenennungsvorgang am Ziel? – Niklas

+0

Der entfernte NFS-Server ist für die Bearbeitung der Umbenennung verantwortlich. Soweit es alle lokalen Programme betrifft, ist die Datei lokal, aber es ist die Aufgabe des NFS-Treibers, sie so aussehen zu lassen, als wäre sie lokal. Dateien werden nie lokal kopiert, um sie umzubenennen oder zu verschieben. –

1

Ich empfehle Ihnen Tanaka akira's escape library zu verwenden Hier ist beispielsweise von einem meiner App:

cmd = Escape.shell_command(['python', Rails::Configuration.new.root_path + '/script/grab.py']).to_s 
system cmd 
Verwandte Themen