首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

FileUtils

Included modules:FileUtils::StreamUtils_

这个程序是免费软件。您可以按照ruby的相同条款分发/修改此程序。

module FileUtils

用于复制,移动,删除等几种文件实用程序方法的命名空间

模块功能

代码语言:javascript
复制
require 'fileutils'

FileUtils.cd(dir, options)
FileUtils.cd(dir, options) {|dir| block }
FileUtils.pwd()
FileUtils.mkdir(dir, options)
FileUtils.mkdir(list, options)
FileUtils.mkdir_p(dir, options)
FileUtils.mkdir_p(list, options)
FileUtils.rmdir(dir, options)
FileUtils.rmdir(list, options)
FileUtils.ln(target, link, options)
FileUtils.ln(targets, dir, options)
FileUtils.ln_s(target, link, options)
FileUtils.ln_s(targets, dir, options)
FileUtils.ln_sf(target, link, options)
FileUtils.cp(src, dest, options)
FileUtils.cp(list, dir, options)
FileUtils.cp_r(src, dest, options)
FileUtils.cp_r(list, dir, options)
FileUtils.mv(src, dest, options)
FileUtils.mv(list, dir, options)
FileUtils.rm(list, options)
FileUtils.rm_r(list, options)
FileUtils.rm_rf(list, options)
FileUtils.install(src, dest, options)
FileUtils.chmod(mode, list, options)
FileUtils.chmod_R(mode, list, options)
FileUtils.chown(user, group, list, options)
FileUtils.chown_R(user, group, list, options)
FileUtils.touch(list, options)

options参数是一个hash选项,从列表中取:force:noop:preserve,和:verbose:noop意味着不做任何更改。其他三个是显而易见的。每种方法都会记录它所授予的选项。

所有具有“source”文件或目录概念的方法都可以采用该参数中的一个文件或文件列表。有关示例,请参阅方法文档。

有一些“低级”方法,它们不接受任何选项:

代码语言:javascript
复制
FileUtils.copy_entry(src, dest, preserve = false, dereference = false)
FileUtils.copy_file(src, dest, preserve = false, dereference = true)
FileUtils.copy_stream(srcstream, deststream)
FileUtils.remove_entry(path, force = false)
FileUtils.remove_entry_secure(path, force = false)
FileUtils.remove_file(path, force = false)
FileUtils.compare_file(path_a, path_b)
FileUtils.compare_stream(stream_a, stream_b)
FileUtils.uptodate?(file, cmp_list)

module FileUtils::Verbose

此模块具有FileUtils模块的所有方法,但在执行操作之前会输出消息。这等同于将:verbose标志传递给FileUtils中的方法。

module FileUtils::NoWrite

此模块具有FileUtils模块的所有方法,但不会更改文件/目录。这等同于将:noop标志传递给FileUtils中的方法。

module FileUtils::DryRun

此模块具有FileUtils模块的所有方法,但不会更改文件/目录。这相当于将文件:noop:verbose标志传递给FileUtils中的方法。

常量

LOW_METHODS METHODS

Public Class Methods

cd(dir, verbose: nil) { |dir| ... } Show source

将当前目录更改为目录dir

如果使用块调用此方法,则在块执行完成后,恢复到旧的工作目录。

代码语言:javascript
复制
FileUtils.cd('/', :verbose => true)   # chdir and report it

FileUtils.cd('/') do  # chdir
  # ...               # do something
end                   # return to original directory
代码语言:javascript
复制
# File lib/fileutils.rb, line 117
def cd(dir, verbose: nil, &block) # :yield: dir
  fu_output_message "cd #{dir}" if verbose
  Dir.chdir(dir, &block)
  fu_output_message 'cd -' if verbose and block
end

Also aliased as: chdir

chdir(dir, verbose: nil)

Alias for: cd

chmod(mode, list, noop: nil, verbose: nil) Show source

将指定文件(in list)中的权限位更改为由表示的位模式mode

mode 是可以使用的符号和绝对模式。

绝对模式是

代码语言:javascript
复制
FileUtils.chmod 0755, 'somecommand'
FileUtils.chmod 0644, %w(my.rb your.rb his.rb her.rb)
FileUtils.chmod 0755, '/usr/bin/ruby', :verbose => true

符号模式是

代码语言:javascript
复制
FileUtils.chmod "u=wrx,go=rx", 'somecommand'
FileUtils.chmod "u=wr,go=rr", %w(my.rb your.rb his.rb her.rb)
FileUtils.chmod "u=wrx,go=rx", '/usr/bin/ruby', :verbose => true

“a”

是user,group,other mask。

“u”

是用户的mask。

“g”

是组的mask。

“o”

是other的mask。

“w”

是写入权限。

“r”

是读取权限。

“x”

是执行权限。

“X”

仅对目录执行权限,必须与“+”一起使用

“s”

是uid,gid。

“t”

是sticky bit。

“+”

被添加到给定指定模式的类中。

“-”

从给定的类给定模式中删除。

“=”

这个类别的确切性质是否会被赋予一个特定的模式。

代码语言:javascript
复制
# File lib/fileutils.rb, line 912
def chmod(mode, list, noop: nil, verbose: nil)
  list = fu_list(list)
  fu_output_message sprintf('chmod %s %s', mode_to_s(mode), list.join(' ')) if verbose
  return if noop
  list.each do |path|
    Entry_.new(path).chmod(fu_mode(mode, path))
  end
end

chmod_R(mode, list, noop: nil, verbose: nil, force: nil) Show source

将指定文件(in list)中的权限位更改为由表示的位模式mode

代码语言:javascript
复制
FileUtils.chmod_R 0700, "/tmp/app.#{$$}"
FileUtils.chmod_R "u=wrx", "/tmp/app.#{$$}"
代码语言:javascript
复制
# File lib/fileutils.rb, line 929
def chmod_R(mode, list, noop: nil, verbose: nil, force: nil)
  list = fu_list(list)
  fu_output_message sprintf('chmod -R%s %s %s',
                            (force ? 'f' : ''),
                            mode_to_s(mode), list.join(' ')) if verbose
  return if noop
  list.each do |root|
    Entry_.new(root).traverse do |ent|
      begin
        ent.chmod(fu_mode(mode, ent.path))
      rescue
        raise unless force
      end
    end
  end
end

chown(user, group, list, noop: nil, verbose: nil) Show source

将指定文件的所有者和组(更改list)更改为用户user和组groupuser并且group可以是ID(整数/字符串)或名称(字符串)。如果user或者group为零,则此方法不会更改该属性。

代码语言:javascript
复制
FileUtils.chown 'root', 'staff', '/usr/local/bin/ruby'
FileUtils.chown nil, 'bin', Dir.glob('/usr/bin/*'), :verbose => true
代码语言:javascript
复制
# File lib/fileutils.rb, line 957
def chown(user, group, list, noop: nil, verbose: nil)
  list = fu_list(list)
  fu_output_message sprintf('chown %s %s',
                            (group ? "#{user}:#{group}" : user || ':'),
                            list.join(' ')) if verbose
  return if noop
  uid = fu_get_uid(user)
  gid = fu_get_gid(group)
  list.each do |path|
    Entry_.new(path).chown uid, gid
  end
end

chown_R(user, group, list, noop: nil, verbose: nil, force: nil) Show source

将指定文件的所有者和组更改为(递归list)用户user和组groupuser并且group可以是ID(整数/字符串)或名称(字符串)。如果user或者group为零,则此方法不会更改该属性。

代码语言:javascript
复制
FileUtils.chown_R 'www', 'www', '/var/www/htdocs'
FileUtils.chown_R 'cvs', 'cvs', '/var/cvs', :verbose => true
代码语言:javascript
复制
# File lib/fileutils.rb, line 981
def chown_R(user, group, list, noop: nil, verbose: nil, force: nil)
  list = fu_list(list)
  fu_output_message sprintf('chown -R%s %s %s',
                            (force ? 'f' : ''),
                            (group ? "#{user}:#{group}" : user || ':'),
                            list.join(' ')) if verbose
  return if noop
  uid = fu_get_uid(user)
  gid = fu_get_gid(group)
  list.each do |root|
    Entry_.new(root).traverse do |ent|
      begin
        ent.chown uid, gid
      rescue
        raise unless force
      end
    end
  end
end

cmp(a, b)

Alias for: compare_file

compare_file(a, b) Show source

如果文件A和文件B的内容相同,则返回true。

代码语言:javascript
复制
FileUtils.compare_file('somefile', 'somefile')  #=> true
FileUtils.compare_file('/bin/cp', '/bin/mv')    #=> maybe false
代码语言:javascript
复制
# File lib/fileutils.rb, line 723
def compare_file(a, b)
  return false unless File.size(a) == File.size(b)
  File.open(a, 'rb') {|fa|
    File.open(b, 'rb') {|fb|
      return compare_stream(fa, fb)
    }
  }
end

另外别名为:相同?, cmp

compare_stream(a,b)显示源文件

如果流的内容相同ab则返回true 。

代码语言:javascript
复制
# File lib/fileutils.rb, line 741
def compare_stream(a, b)
  bsize = fu_stream_blksize(a, b)
  sa = ""
  sb = ""
  begin
    a.read(bsize, sa)
    b.read(bsize, sb)
    return true if sa.empty? && sb.empty?
  end while sa == sb
  false
end

copy(src, dest, preserve: nil, noop: nil, verbose: nil)

Alias for: cp

copy_entry(src,dest,preserve = false,dereference_root = false,remove_destination = false)显示源代码

将文件系统条目复制srcdest。如果src是目录,则此方法递归复制其内容。此方法保留文件类型,比如符号链接,目录...(FIFO,设备文件等尚不受支持)

srcdest必须为路径名。src必须存在,dest不得存在。

如果preserve属实,则此方法将保留所有者,组和修改时间。无论权限是否被复制preserve

如果dereference_root为true,则此方法解引用tree root。

如果remove_destination为true,则此方法在复制之前删除每个目标文件。

代码语言:javascript
复制
# File lib/fileutils.rb, line 410
def copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
  Entry_.new(src, nil, dereference_root).wrap_traverse(proc do |ent|
    destent = Entry_.new(dest, ent.rel, false)
    File.unlink destent.path if remove_destination && File.file?(destent.path)
    ent.copy destent.path
  end, proc do |ent|
    destent = Entry_.new(dest, ent.rel, false)
    ent.copy_metadata destent.path if preserve
  end)
end

copy_file(src,dest,preserve = false,dereference = true)显示源文件

复制文件的内容srcdest。两者的srcdest必须的路径名。

代码语言:javascript
复制
# File lib/fileutils.rb, line 426
def copy_file(src, dest, preserve = false, dereference = true)
  ent = Entry_.new(src, nil, dereference)
  ent.copy_file dest
  ent.copy_metadata dest if preserve
end

copy_stream(src,dest)显示源文件

将流复制srcdestsrc必须响应读取(n)并且dest必须响应写入(str)。

代码语言:javascript
复制
# File lib/fileutils.rb, line 438
def copy_stream(src, dest)
  IO.copy_stream(src, dest)
end

cp(src,dest,preserve:nil,noop:nil,verbose:nil)显示源文件

将文件内容复制srcdest。如果dest是目录,则复制srcdest/src

如果src是文件列表,则dest必须是目录。

代码语言:javascript
复制
FileUtils.cp 'eval.c', 'eval.c.org'
FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6', :verbose => true
FileUtils.cp 'symlink', 'dest'   # copy content, "dest" is not a symlink
代码语言:javascript
复制
# File lib/fileutils.rb, line 351
def cp(src, dest, preserve: nil, noop: nil, verbose: nil)
  fu_output_message "cp#{preserve ? ' -p' : ''} #{[src,dest].flatten.join ' '}" if verbose
  return if noop
  fu_each_src_dest(src, dest) do |s, d|
    copy_file s, d, preserve
  end
end

另外别名为:copy

cp_r(src,dest,preserve:nil,noop:nil,详细:nil,dereference_root:true,remove_destination:nil)显示源代码

复制srcdest。如果src是目录,则此方法将递归地复制其所有内容。如果dest是目录,则复制srcdest/src

src 可以是文件列表。

代码语言:javascript
复制
# Installing Ruby library "mylib" under the site_ruby
FileUtils.rm_r site_ruby + '/mylib', :force
FileUtils.cp_r 'lib/', site_ruby + '/mylib'

# Examples of copying several files to target directory.
FileUtils.cp_r %w(mail.rb field.rb debug/), site_ruby + '/tmail'
FileUtils.cp_r Dir.glob('*.rb'), '/home/foo/lib/ruby', :noop => true, :verbose => true

# If you want to copy all contents of a directory instead of the
# directory itself, c.f. src/x -> dest/x, src/y -> dest/y,
# use following code.
FileUtils.cp_r 'src/.', 'dest'     # cp_r('src', 'dest') makes dest/src,
                                   # but this doesn't.
代码语言:javascript
复制
# File lib/fileutils.rb, line 384
def cp_r(src, dest, preserve: nil, noop: nil, verbose: nil,
         dereference_root: true, remove_destination: nil)
  fu_output_message "cp -r#{preserve ? 'p' : ''}#{remove_destination ? ' --remove-destination' : ''} #{[src,dest].flatten.join ' '}" if verbose
  return if noop
  fu_each_src_dest(src, dest) do |s, d|
    copy_entry s, d, preserve, dereference_root, remove_destination
  end
end

getwd()

别名为:pwd

identical?(a, b)

别名为:compare_file

install(src,dest,mode:nil,owner:nil,group:nil,preserve:nil,noop:nil,verbose:nil)显示源代码

如果srcdest不相同,则将其复制并将权限模式更改为mode。如果dest是目录,则目标是dest/ src。此方法在复制之前删除目标。

代码语言:javascript
复制
FileUtils.install 'ruby', '/usr/local/bin/ruby', :mode => 0755, :verbose => true
FileUtils.install 'lib.rb', '/usr/local/lib/ruby/site_ruby', :verbose => true
代码语言:javascript
复制
# File lib/fileutils.rb, line 762
def install(src, dest, mode: nil, owner: nil, group: nil, preserve: nil,
            noop: nil, verbose: nil)
  if verbose
    msg = +"install -c"
    msg << ' -p' if preserve
    msg << ' -m ' << mode_to_s(mode) if mode
    msg << " -o #{owner}" if owner
    msg << " -g #{group}" if group
    msg << ' ' << [src,dest].flatten.join(' ')
    fu_output_message msg
  end
  return if noop
  uid = fu_get_uid(owner)
  gid = fu_get_gid(group)
  fu_each_src_dest(src, dest) do |s, d|
    st = File.stat(s)
    unless File.exist?(d) and compare_file(s, d)
      remove_file d, true
      copy_file s, d
      File.utime st.atime, st.mtime, d if preserve
      File.chmod fu_mode(mode, st), d if mode
      File.chown uid, gid, d if uid or gid
    end
  end
end

link(src, dest, force: nil, noop: nil, verbose: nil)

别名为:ln

ln(target, link, force: nil, noop: nil, verbose: nil) 显示源

ln(target, dir, force: nil, noop: nil, verbose: nil)

ln(targets, dir, force: nil, noop: nil, verbose: nil)

在第一种形式,创建一个硬链接link指向target。如果link已经存在,则引发Errno::EEXIST。但是,如果设置:force选项,则会覆盖link

代码语言:javascript
复制
FileUtils.ln 'gcc', 'cc', verbose: true
FileUtils.ln '/usr/bin/emacs21', '/usr/bin/emacs'

在第二种形式中,创建dir/target指向的链接target。在第三种形式中,在目录中创建几个硬链接dir,指向每个项目targets。如果dir不是目录,则引发Errno::ENOTDIR。

代码语言:javascript
复制
FileUtils.cd '/sbin'
FileUtils.ln %w(cp mv mkdir), '/bin'   # Now /sbin/cp and /bin/cp are linked.
代码语言:javascript
复制
# File lib/fileutils.rb, line 281
def ln(src, dest, force: nil, noop: nil, verbose: nil)
  fu_output_message "ln#{force ? ' -f' : ''} #{[src,dest].flatten.join ' '}" if verbose
  return if noop
  fu_each_src_dest0(src, dest) do |s,d|
    remove_file d, true if force
    File.link s, d
  end
end

另外别名为:link

ln_s(target, link, force: nil, noop: nil, verbose: nil) Show source

ln_s(target, dir, force: nil, noop: nil, verbose: nil)

ln_s(targets, dir, force: nil, noop: nil, verbose: nil)

在第一种形式,创建了一个符号链接link指向target。如果link已经存在,则引发Errno::EEXIST。但是,如果设置:force选项,则会覆盖link

代码语言:javascript
复制
FileUtils.ln_s '/usr/bin/ruby', '/usr/local/bin/ruby'
FileUtils.ln_s 'verylongsourcefilename.c', 'c', force: true

在第二种形式中,创建dir/target指向的链接target。在第三种形式中,在目录中创建几个符号链接dir,指向每个项目targets。如果dir不是目录,则引发Errno::ENOTDIR。

代码语言:javascript
复制
FileUtils.ln_s Dir.glob('/bin/*.rb'), '/home/foo/bin'
代码语言:javascript
复制
# File lib/fileutils.rb, line 314
def ln_s(src, dest, force: nil, noop: nil, verbose: nil)
  fu_output_message "ln -s#{force ? 'f' : ''} #{[src,dest].flatten.join ' '}" if verbose
  return if noop
  fu_each_src_dest0(src, dest) do |s,d|
    remove_file d, true if force
    File.symlink s, d
  end
end

另外别名为:symlink

ln_sf(*args) Show source

与下列一样

代码语言:javascript
复制
FileUtils.ln_s(*args, force: true)
代码语言:javascript
复制
# File lib/fileutils.rb, line 335
def ln_sf(src, dest, noop: nil, verbose: nil)
  ln_s src, dest, force: true, noop: noop, verbose: verbose
end

makedirs(list, mode: nil, noop: nil, verbose: nil)

别名为:mkdir_p

mkdir(list, mode: nil, noop: nil, verbose: nil) Show source

创建一个或多个目录。

代码语言:javascript
复制
FileUtils.mkdir 'test'
FileUtils.mkdir %w( tmp data )
FileUtils.mkdir 'notexist', :noop => true  # Does not really create.
FileUtils.mkdir 'tmp', :mode => 0700
代码语言:javascript
复制
# File lib/fileutils.rb, line 159
def mkdir(list, mode: nil, noop: nil, verbose: nil)
  list = fu_list(list)
  fu_output_message "mkdir #{mode ? ('-m %03o ' % mode) : ''}#{list.join ' '}" if verbose
  return if noop

  list.each do |dir|
    fu_mkdir dir, mode
  end
end

mkdir_p(list, mode: nil, noop: nil, verbose: nil) Show source

创建一个目录及其所有父目录。例如,

代码语言:javascript
复制
FileUtils.mkdir_p '/usr/local/lib/ruby'

导致以下目录,如果它不存在。

  • /usr
  • /usr/local
  • /usr/local/lib
  • /usr/local/lib/ruby

您可以一次在列表中传递多个目录。

代码语言:javascript
复制
# File lib/fileutils.rb, line 185
def mkdir_p(list, mode: nil, noop: nil, verbose: nil)
  list = fu_list(list)
  fu_output_message "mkdir -p #{mode ? ('-m %03o ' % mode) : ''}#{list.join ' '}" if verbose
  return *list if noop

  list.map {|path| remove_trailing_slash(path)}.each do |path|
    # optimize for the most common case
    begin
      fu_mkdir path, mode
      next
    rescue SystemCallError
      next if File.directory?(path)
    end

    stack = []
    until path == stack.last   # dirname("/")=="/", dirname("C:/")=="C:/"
      stack.push path
      path = File.dirname(path)
    end
    stack.reverse_each do |dir|
      begin
        fu_mkdir dir, mode
      rescue SystemCallError
        raise unless File.directory?(dir)
      end
    end
  end

  return *list
end

还有别名:mkpath,makedirs

mkpath(list, mode: nil, noop: nil, verbose: nil)

别名为:mkdir_p

move(src, dest, force: nil, noop: nil, verbose: nil, secure: nil)

别名为:mv

mv(src, dest, force: nil, noop: nil, verbose: nil, secure: nil) Show source

将文件移动srcdest。如果filedest在不同的磁盘分区存在,则文件被复制,则原始文件被删除。

代码语言:javascript
复制
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/foo/.trash/'
FileUtils.mv Dir.glob('test*.rb'), 'test', :noop => true, :verbose => true
代码语言:javascript
复制
# File lib/fileutils.rb, line 453
def mv(src, dest, force: nil, noop: nil, verbose: nil, secure: nil)
  fu_output_message "mv#{force ? ' -f' : ''} #{[src,dest].flatten.join ' '}" if verbose
  return if noop
  fu_each_src_dest(src, dest) do |s, d|
    destent = Entry_.new(d, nil, true)
    begin
      if destent.exist?
        if destent.directory?
          raise Errno::EEXIST, d
        else
          destent.remove_file if rename_cannot_overwrite_file?
        end
      end
      begin
        File.rename s, d
      rescue Errno::EXDEV
        copy_entry s, d, true
        if secure
          remove_entry_secure s, force
        else
          remove_entry s, force
        end
      end
    rescue SystemCallError
      raise unless force
    end
  end
end

Also aliased as: move

pwd() Show source

返回当前目录的名称。

代码语言:javascript
复制
# File lib/fileutils.rb, line 97
def pwd
  Dir.pwd
end

另外别名为:getwd

remove(list, force: nil, noop: nil, verbose: nil)

别名为:rm

remove_dir(path, force = false) Show source

dir递归删除一个目录及其内容。如果force为true,则此方法忽略StandardError 。

代码语言:javascript
复制
# File lib/fileutils.rb, line 712
def remove_dir(path, force = false)
  remove_entry path, force   # FIXME?? check if it is a directory
end

remove_entry(path, force = false) Show source

此方法删除文件系统条目pathpath可能是一个普通文件,一个目录或其他东西。如果path是目录,请递归删除。

另请参见remove_entry_secure。

代码语言:javascript
复制
# File lib/fileutils.rb, line 684
def remove_entry(path, force = false)
  Entry_.new(path).postorder_traverse do |ent|
    begin
      ent.remove
    rescue
      raise unless force
    end
  end
rescue
  raise unless force
end

remove_entry_secure(path,force = false)显示源文件

此方法删除文件系统条目pathpath应该是一个普通文件,一个目录或其他东西。如果path是目录,请递归删除它。需要此方法以避免rm_r的本地安全漏洞的TOCTTOU(检查时间到达时间)漏洞。在以下情况下rm_r会导致安全漏洞:

  • 父目录是世界可写的(包括/ tmp)。
  • 删除目录树包括世界可写目录。
  • 系统具有符号链接。为避免此安全漏洞,此方法采用特殊预处理。如果path是目录,则此方法chown(2)和chmod(2)全部删除目录。这要求当前进程是删除整个目录树的所有者,或者是超级用户(root)。

警告:您必须确保所有父目录不能被其他不受信任的用户移动。例如,父目录不应该由不受信任的用户拥有,并且除了设置sticky位之外不应该是世界可写的。

警告:只有除去目录树的所有者或Unix超级用户(root)才能调用此方法。否则,此方法不起作用。

对于fileutils.rb,此漏洞在ruby-dev:26100中报告。

代码语言:javascript
复制
               # File fileutils.rb, line 704
def remove_file(path, force = false)
  Entry_.new(path).remove_file
rescue
  raise unless force
end

remove_file(path, force = false)

删除文件path。如果force为true,则此方法忽略StandardError。

代码语言:javascript
复制
FileUtils.rm %w( junk.txt dust.txt )
FileUtils.rm Dir.glob('*.so')
FileUtils.rm 'NotExistFile', :force => true   # never raises exception
代码语言:javascript
复制
               # File fileutils.rb, line 502
def rm(list, force: nil, noop: nil, verbose: nil)
  list = fu_list(list)
  fu_output_message "rm#{force ? ' -f' : ''} #{list.join ' '}" if verbose
  return if noop

  list.each do |path|
    remove_file path, force
  end
end

另外别名为:delete

rm_f(list, noop: nil, verbose: nil)

等同于

代码语言:javascript
复制
FileUtils.rm(list, :force => true)
代码语言:javascript
复制
               # File fileutils.rb, line 521
def rm_f(list, noop: nil, verbose: nil)
  rm list, force: true, noop: noop, verbose: verbose
end

另外别名为:safe_unlink

rm_r(list, force: nil, noop: nil, verbose: nil, secure: nil)

删除文件list[0]list[1]...如果list[n]是目录,则递归删除其所有内容。当设置force选项时,此方法忽略StandardError。

代码语言:javascript
复制
FileUtils。rm_r  Dir。glob('/ tmp / *')
 FileUtils。rm_r'some_dir  ',:force  =>  true

警告:如果父目录或删除目录树中的一个是世界可写的(包括/ tmp,其权限为1777),并且当前进程具有强权限,如Unix超级用户(root),并且系统具有符号链接。为了安全移除,请仔细阅读remove_entry_secure文档,并将secure选项设置为true。缺省值是:secure => false。

注意:如果设置了secure选项,则此方法调用remove_entry_secure。另请参见remove_entry_secure。

代码语言:javascript
复制
   # File fileutils.rb, line 548
def rm_r(list, force: nil, noop: nil, verbose: nil, secure: nil)
  list = fu_list(list)
  fu_output_message "rm -r#{force ? 'f' : ''} #{list.join ' '}" if verbose
  return if noop
  list.each do |path|
    if secure
      remove_entry_secure path, force
    else
      remove_entry path, force
    end
  end
end

rm_rf (list,noop:nil,verbose:nil,secure:nil)

相当于

代码语言:javascript
复制
FileUtils。rm_r(list,:force  =>  true)

警告:此方法会导致本地漏洞。首先阅读rm_r的文档。

代码语言:javascript
复制
   # File fileutils.rb, line 570
def rm_rf(list, noop: nil, verbose: nil, secure: nil)
  rm_r list, force: true, noop: noop, verbose: verbose, secure: secure
end

另外别名为:rmtree

rmdir (list,parents:nil,noop:nil,verbose:nil)

删除一个或多个目录。

代码语言:javascript
复制
FileUtils.rmdir 'somedir'
FileUtils.rmdir %w(somedir anydir otherdir)
# Does not really remove directory; outputs message.
FileUtils.rmdir 'somedir', :verbose => true, :noop => true
代码语言:javascript
复制
               # File fileutils.rb, line 244
def rmdir(list, parents: nil, noop: nil, verbose: nil)
  list = fu_list(list)
  fu_output_message "rmdir #{parents ? '-p ' : ''}#{list.join ' '}" if verbose
  return if noop
  list.each do |dir|
    Dir.rmdir(dir = remove_trailing_slash(dir))
    if parents
      begin
        until (parent = File.dirname(dir)) == '.' or parent == dir
          dir = parent
          Dir.rmdir(dir)
        end
      rescue Errno::ENOTEMPTY, Errno::EEXIST, Errno::ENOENT
      end
    end
  end
end

rmtree(list, noop: nil, verbose: nil, secure: nil)

别名为: rm_rf

safe_unlink(list, noop: nil, verbose: nil)

别名为:rm_f

symlink(src, dest, force: nil, noop: nil, verbose: nil)

别名为:ln_s

touch (list,noop:nil,verbose:nil,mtime:nil,nocreate:nil)

更新文件中的修改时间(mtime)和访问时间(atime) list。如果文件不存在,则会创建文件。

代码语言:javascript
复制
FileUtils.touch 'timestamp'
FileUtils.touch Dir.glob('*.c');  system 'make'
代码语言:javascript
复制
               # File fileutils.rb, line 1043
def touch(list, noop: nil, verbose: nil, mtime: nil, nocreate: nil)
  list = fu_list(list)
  t = mtime
  if verbose
    fu_output_message "touch #{nocreate ? '-c ' : ''}#{t ? t.strftime('-t %Y%m%d%H%M.%S ') : ''}#{list.join ' '}"
  end
  return if noop
  list.each do |path|
    created = nocreate
    begin
      File.utime(t, t, path)
    rescue Errno::ENOENT
      raise if created
      File.open(path, 'a') {
        ;
      }
      created = true
      retry if t
    end
  end
end

uptodate?(new, old_list)

如果new比全部更新,则返回trueold_list。不存在的文件比任何文件都旧。

代码语言:javascript
复制
FileUtils.uptodate?('hello.o', %w(hello.c hello.h)) or \
    system 'make hello.o'
代码语言:javascript
复制
               # File fileutils.rb, line 136
def uptodate?(new, old_list)
  return false unless File.exist?(new)
  new_time = File.mtime(new)
  old_list.each do |old|
    if File.exist?(old)
      return false unless new_time > File.mtime(old)
    end
  end
  true
end

  • /usr
  • /usr/local
  • /usr/local/lib
  • /usr/local/lib/ruby

??你可以在一个列表中一次传递多个目录

# File lib/fileutils.rb, line 185

def mkdir_p(list, mode: nil, noop: nil, verbose: nil) list = fu_list(list)

fu_output_message "mkdir -p #{mode ? ('-m %03o ' % mode) : ''}#{list.join ' '}" if verbose return *list if noop list.map {|path| remove_trailing_slash(path)}.each do |path|

# optimize for the most common case

begin

fu_mkdir path, mode

next rescue SystemCallError

next

if File.directory?(path) end stack = [] until path == stack.last # dirname("/")=="/", dirname("C:/")=="C:/"

stack.push path

path = File.dirname(path)

end stack.reverse_each do |dir|

begin fu_mkdir dir, mode

rescue SystemCallError

raise unless File.directory?(dir)

end

end

end

return *list

end

还有别名:mkpath,makedirs mkpath(list,mode:nil,noop:nil,verbose:nil)

别名为:mkdir_p move(src,dest,force:nil,noop:nil,verbose:nil,secure:nil)

别名 for:mv mv(src,dest,force:nil,noop:nil,verbose:nil,secure:nil)显示源将文件src移动到dest。 如果文件和目录存在于不同的磁盘分区上,则会复制该文件,然后是原始文件

removed.FileUtils.mv 'badname.rb', 'goodname.rb'

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

FileUtils.mv %w(junk.txt dust.txt), '/home/foo/.trash/'

FileUtils.mv Dir.glob('test*.rb'), 'test', :noop => true, :verbose => true# File lib/fileutils.rb, line 453

Def mv(src, dest, force: nil, noop: nil, verbose: nil, secure: nil)

??Fu_output_message "mv#{force ? ' -f' : ''} #{[src,dest].flatten.join ' '}" if verbose

??Return if noop

??Fu_each_src_dest(src, dest) do |s, d|

????Destent = Entry_.new(d, nil, true)

????Begin

??????If destent.exist?

????????If destent.directory?

??????????Raise Errno::EEXIST, d

????????Else

??????????Destent.remove_file if rename_cannot_overwrite_file?

????????End

??????End

??????Begin

????????File.rename s, d

??????Rescue Errno::EXDEV

????????Copy_entry s, d, true

????????If secure

??????????Remove_entry_secure s, force

????????Else

??????????Remove_entry s, force

????????End

??????End

????Rescue SystemCallErro

??????Raise unless force

????End

??End

End

别名为: move pwd() Show source

返回现字典的名称。

# File lib/fileutils.rb, line 97 def pwd

Dir.pwd

end

别名 为: getwd remove(list, force: nil, noop: nil, verbose: nil)

别名为: rm remove_dir(path, force = false) Show source

递归移除到目录dir及其内容。 StandardError的忽略这个方法,如果force是真实的。

StandardError if force is true.# File lib/fileutils.rb, line 712

def remove_dir(path, force = false)

remove_entry path, force # FIXME?? check if it is a directory

end remove_entry(path, force = false) Show source

该方法删除文件系统的入口路径。路径可能是一个常规文件,一个目录或其他东西。如果path是目录,请递归删除它。

另见

remove_entry_secure.# File lib/fileutils.rb, line 684

def remove_entry(path, force = false)

Entry_.new(path).postorder_traverse do |ent|

begin

ent.remove

rescue

raise unless force

end

end

rescue

raise unless force

end remove_entry_secure(path, force = false) Show source

显示源此方法删除文件系统条目路径。路径应该是一个普通文件,一个目录或者其他东西。如果path是目录,请递归删除它。需要此方法以避免rm_r的本地安全漏洞的TOCTTOU(检查时间到达时间)漏洞。

在以下情况下rm_r会导致安全漏洞:

  • 父目录是世界可写的(包括/ tmp)。
  • 删除目录树包括世界可写目录。
  • 该系统具有符号链接。

为避免此安全漏洞,此方法应用特殊的预处理。如果path是目录,则此方法chown(2)和chmod(2)全部删除目录。这要求当前进程是删除整个目录树的所有者,或者是超级用户(root)。

警告:您必须确保所有父目录不能被其他不受信任的用户移动。例如,父目录不应该由不受信任的用户拥有,除非设置了粘滞位,否则不应该是世界可写的。

警告:只有删除目录树的所有者或Unix超级用户(root)才能调用此方法。否则,此方法不起作用。

有关此安全漏洞的详细信息,请参阅Perl的案例:

对于fileutils.rb,此漏洞在ruby-dev:26100中报告。

代码语言:javascript
复制
# File lib/fileutils.rb, line 607
def remove_entry_secure(path, force = false)
  unless fu_have_symlink?
    remove_entry path, force
    return
  end
  fullpath = File.expand_path(path)
  st = File.lstat(fullpath)
  unless st.directory?
    File.unlink fullpath
    return
  end
  # is a directory.
  parent_st = File.stat(File.dirname(fullpath))
  unless parent_st.world_writable?
    remove_entry path, force
    return
  end
  unless parent_st.sticky?
    raise ArgumentError, "parent directory is world writable, FileUtils#remove_entry_secure does not work; abort: #{path.inspect} (parent directory mode #{'%o' % parent_st.mode})"
  end
  # freeze tree root
  euid = Process.euid
  File.open(fullpath + '/.') {|f|
    unless fu_stat_identical_entry?(st, f.stat)
      # symlink (TOC-to-TOU attack?)
      File.unlink fullpath
      return
    end
    f.chown euid, -1
    f.chmod 0700
    unless fu_stat_identical_entry?(st, File.lstat(fullpath))
      # TOC-to-TOU attack?
      File.unlink fullpath
      return
    end
  }
  # ---- tree root is frozen ----
  root = Entry_.new(path)
  root.preorder_traverse do |ent|
    if ent.directory?
      ent.chown euid, -1
      ent.chmod 0700
    end
  end
  root.postorder_traverse do |ent|
    begin
      ent.remove
    rescue
      raise unless force
    end
  end
rescue
  raise unless force
end

remove_file(path, force = false) Show source

删除文件path。如果force为true,则此方法忽略StandardError 。

代码语言:javascript
复制
# File lib/fileutils.rb, line 701
def remove_file(path, force = false)
  Entry_.new(path).remove_file
rescue
  raise unless force
end

rm(list, force: nil, noop: nil, verbose: nil) Show source

删除中指定的文件list。此方法无法删除目录。当设置了:force选项时,所有StandardErrors都会被忽略。

代码语言:javascript
复制
FileUtils.rm %w( junk.txt dust.txt )
FileUtils.rm Dir.glob('*.so')
FileUtils.rm 'NotExistFile', :force => true   # never raises exception
代码语言:javascript
复制
# File lib/fileutils.rb, line 499
def rm(list, force: nil, noop: nil, verbose: nil)
  list = fu_list(list)
  fu_output_message "rm#{force ? ' -f' : ''} #{list.join ' '}" if verbose
  return if noop

  list.each do |path|
    remove_file path, force
  end
end

另外别名为:remove

rm_f(list, noop: nil, verbose: nil) Show source

相当于

代码语言:javascript
复制
FileUtils.rm(list, :force => true)
代码语言:javascript
复制
# File lib/fileutils.rb, line 518
def rm_f(list, noop: nil, verbose: nil)
  rm list, force: true, noop: noop, verbose: verbose
end

另外别名为:safe_unlink

rm_r(list, force: nil, noop: nil, verbose: nil, secure: nil) Show source

删除文件list[0] list[1]...如果list[n]是目录,则递归删除其所有内容。当设置force选项时,此方法忽略StandardError。

代码语言:javascript
复制
FileUtils.rm_r Dir.glob('/tmp/*')
FileUtils.rm_r 'some_dir', :force => true

警告:如果父目录或删除目录树中的一个是世界可写的(包括/ tmp,其权限为1777),并且当前进程具有强权限,如Unix超级用户(root),并且系统具有符号链接。为了安全移除,请仔细阅读remove_entry_secure文档,并将secure选项设置为true。缺省值是:secure => false。

注意:如果设置了secure选项,则此方法调用remove_entry_secure。另请参见remove_entry_secure。

代码语言:javascript
复制
# File lib/fileutils.rb, line 545
def rm_r(list, force: nil, noop: nil, verbose: nil, secure: nil)
  list = fu_list(list)
  fu_output_message "rm -r#{force ? 'f' : ''} #{list.join ' '}" if verbose
  return if noop
  list.each do |path|
    if secure
      remove_entry_secure path, force
    else
      remove_entry path, force
    end
  end
end

rm_rf(list, noop: nil, verbose: nil, secure: nil) Show source

相当于

代码语言:javascript
复制
FileUtils.rm_r(list, :force => true)

警告:此方法会导致本地漏洞。首先阅读rm_r的文档。

代码语言:javascript
复制
# File lib/fileutils.rb, line 567
def rm_rf(list, noop: nil, verbose: nil, secure: nil)
  rm_r list, force: true, noop: noop, verbose: verbose, secure: secure
end

另外别名为:rmtree

rmdir(list,parents:nil,noop:nil,verbose:nil)显示源文件

删除一个或多个目录。

代码语言:javascript
复制
FileUtils.rmdir 'somedir'
FileUtils.rmdir %w(somedir anydir otherdir)
# Does not really remove directory; outputs message.
FileUtils.rmdir 'somedir', :verbose => true, :noop => true
代码语言:javascript
复制
# File lib/fileutils.rb, line 241
def rmdir(list, parents: nil, noop: nil, verbose: nil)
  list = fu_list(list)
  fu_output_message "rmdir #{parents ? '-p ' : ''}#{list.join ' '}" if verbose
  return if noop
  list.each do |dir|
    begin
      Dir.rmdir(dir = remove_trailing_slash(dir))
      if parents
        until (parent = File.dirname(dir)) == '.' or parent == dir
          dir = parent
          Dir.rmdir(dir)
        end
      end
    rescue Errno::ENOTEMPTY, Errno::EEXIST, Errno::ENOENT
    end
  end
end

rmtree(list, noop: nil, verbose: nil, secure: nil)

别名为:rm_rf

safe_unlink(list, noop: nil, verbose: nil)

别名为:rm_f

symlink(src, dest, force: nil, noop: nil, verbose: nil)

别名为:ln_s

touch(list,noop:nil,verbose:nil,mtime:nil,nocreate:nil)显示源代码

更新文件中的修改时间(mtime)和访问时间(atime)list。如果文件不存在,则会创建文件。

代码语言:javascript
复制
FileUtils.touch 'timestamp'
FileUtils.touch Dir.glob('*.c');  system 'make'
代码语言:javascript
复制
# File lib/fileutils.rb, line 1040
def touch(list, noop: nil, verbose: nil, mtime: nil, nocreate: nil)
  list = fu_list(list)
  t = mtime
  if verbose
    fu_output_message "touch #{nocreate ? '-c ' : ''}#{t ? t.strftime('-t %Y%m%d%H%M.%S ') : ''}#{list.join ' '}"
  end
  return if noop
  list.each do |path|
    created = nocreate
    begin
      File.utime(t, t, path)
    rescue Errno::ENOENT
      raise if created
      File.open(path, 'a') {
        ;
      }
      created = true
      retry if t
    end
  end
end

uptodate?(new,old_list)显示源代码

如果new比全部更新,则返回true old_list。不存在的文件比任何文件都旧。

代码语言:javascript
复制
FileUtils.uptodate?('hello.o', %w(hello.c hello.h)) or      system 'make hello.o'
代码语言:javascript
复制
# File lib/fileutils.rb, line 134
def uptodate?(new, old_list)
  return false unless File.exist?(new)
  new_time = File.mtime(new)
  old_list.each do |old|
    if File.exist?(old)
      return false unless new_time > File.mtime(old)
    end
  end
  true
end

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com