# Copyright (c) 2003 WATANABE Hirofumi <eban@ruby-lang.org>
# This program is free software.
# You can distribute/modify this program under the same terms of Ruby.
# == Utilities to replace common UNIX commands in Makefiles etc
# ruby -run -e cp -- [OPTION] SOURCE DEST
# ruby -run -e ln -- [OPTION] TARGET LINK_NAME
# ruby -run -e mv -- [OPTION] SOURCE DEST
# ruby -run -e rm -- [OPTION] FILE
# ruby -run -e mkdir -- [OPTION] DIRS
# ruby -run -e rmdir -- [OPTION] DIRS
# ruby -run -e install -- [OPTION] SOURCE DEST
# ruby -run -e chmod -- [OPTION] OCTAL-MODE FILE
# ruby -run -e touch -- [OPTION] FILE
# ruby -run -e help [COMMAND]
@fileutils_output = $stdout
ARGV.delete_if{|x| x == "-"}
options.scan(/.:?/) do |s|
o.on("-" + s.tr(":", " ")) do |val|
opt_hash[s.delete(":").intern] = val
o.on("-v") do opt_hash[:verbose] = true end
# Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY
# ruby -run -e cp -- [OPTION] SOURCE DEST
# -p preserve file attributes if possible
setup("pr") do |argv, options|
cmd += "_r" if options.delete :r
options[:preserve] = true if options.delete :p
argv = argv[0] if argv.size == 1
FileUtils.send cmd, argv, dest, options
# Create a link to the specified TARGET with LINK_NAME.
# ruby -run -e ln -- [OPTION] TARGET LINK_NAME
# -s make symbolic links instead of hard links
# -f remove existing destination files
setup("sf") do |argv, options|
cmd += "_s" if options.delete :s
options[:force] = true if options.delete :f
argv = argv[0] if argv.size == 1
FileUtils.send cmd, argv, dest, options
# Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.
# ruby -run -e mv -- [OPTION] SOURCE DEST
argv = argv[0] if argv.size == 1
FileUtils.mv argv, dest, options
# ruby -run -e rm -- [OPTION] FILE
# -f ignore nonexistent files
# -r remove the contents of directories recursively
setup("fr") do |argv, options|
cmd += "_r" if options.delete :r
options[:force] = true if options.delete :f
FileUtils.send cmd, argv, options
# Create the DIR, if they do not already exist.
# ruby -run -e mkdir -- [OPTION] DIR
# -p no error if existing, make parent directories as needed
setup("p") do |argv, options|
cmd += "_p" if options.delete :p
FileUtils.send cmd, argv, options
# ruby -run -e rmdir -- [OPTION] DIR
FileUtils.rmdir argv, options
# ruby -run -e install -- [OPTION] SOURCE DEST
# -p apply access/modification times of SOURCE files to
# corresponding destination files
# -m set permission mode (as in chmod), instead of 0755
setup("pm:") do |argv, options|
options[:mode] = (mode = options.delete :m) ? mode.oct : 0755
options[:preserve] = true if options.delete :p
argv = argv[0] if argv.size == 1
FileUtils.install argv, dest, options
# Change the mode of each FILE to OCTAL-MODE.
# ruby -run -e chmod -- [OPTION] OCTAL-MODE FILE
FileUtils.chmod mode, argv, options
# Update the access and modification times of each FILE to the current time.
# ruby -run -e touch -- [OPTION] FILE
FileUtils.touch argv, options
# ruby -run -e help [COMMAND]
if help = me.gets("\n\n")
if all or argv.delete help[/-e \w+/].sub(/-e /, "")
print help.gsub(/^# ?/, "")