FileUtils

Added in v1.8 · Updated March 13, 2026 · Modules
ruby stdlib fileutils filesystem io

The FileUtils module provides utilities for manipulating files and directories in Ruby. It’s part of the standard library and offers methods for copying, moving, deleting, and creating files and directories.

Overview

FileUtils simplifies common filesystem operations:

  • File operations: Copy, move, delete, rename files
  • Directory operations: Create, remove, navigate directories
  • Permissions: Change file modes and ownership
  • Comparison: Compare files and directories

Loading FileUtils

require "fileutils"

For convenience methods without prefix:

include FileUtils

File Operations

Copying Files

require "fileutils"

# Copy a single file
FileUtils.cp("source.txt", "destination.txt")

# Copy multiple files to a directory
FileUtils.cp(["file1.txt", "file2.txt"], "backup/")

# Preserve metadata
FileUtils.cp("source.txt", "destination.txt", preserve: true)

Moving and Renaming

require "fileutils"

# Move a file
FileUtils.mv("old.txt", "new.txt")

# Move files to a directory
FileUtils.mv(["file1.txt", "file2.txt"], "documents/")

# Rename (same as mv within same directory)
FileUtils.mv("old_name.txt", "new_name.txt")

Deleting Files

require "fileutils"

# Remove a single file
FileUtils.rm("file.txt")

# Remove multiple files
FileUtils.rm(["file1.txt", "file2.txt"])

# Remove file if it exists (no error if missing)
FileUtils.rm_f("file.txt")

# Remove all files matching a pattern
FileUtils.rm_rf("*.tmp")

Creating Files

require "fileutils"

# Create an empty file
FileUtils.touch("newfile.txt")

# Update modification time
FileUtils.touch("existing.txt")

# Create multiple files
FileUtils.touch(["file1.txt", "file2.txt"])

Directory Operations

Creating Directories

require "fileutils"

# Create a single directory
FileUtils.mkdir("new_folder")

# Create nested directories
FileUtils.mkdir_p("path/to/nested/folder")

# Create directory with specific mode
FileUtils.mkdir("restricted", mode: 0o750)

Removing Directories

require "fileutils"

# Remove empty directory
FileUtils.rmdir("empty_folder")

# Remove directory and all contents
FileUtils.rm_r("folder/")

# Remove directory if it exists
FileUtils.rm_rf("folder/")

Listing Directory Contents

require "fileutils"

# List files in directory
FileUtils.ls(".")

# List with details (like ls -l)
FileUtils.ls_l(".")

# Recursive listing
FileUtils.ls_r(".")

File Comparison

Comparing Files

require "fileutils"

# Check if files are identical
FileUtils.cmp("file1.txt", "file2.txt")  # => true or false

# Same as cmp
FileUtils.compare_file("file1.txt", "file2.txt")

Comparing Directories

require "fileutils"

# Check if directories have same content
FileUtils.compare_dir("dir1/", "dir2/")

Permissions

Changing Permissions

require "fileutils"

# Change permission mode
FileUtils.chmod(0644, "file.txt")

# Change permissions recursively
FileUtils.chmod_R(0755, "scripts/")

# Change owner
FileUtils.chown("user:group", "file.txt")

# Change owner recursively
FileUtils.chown_R("user:group", "folder/")

Common Permission Patterns

# Make a script executable
FileUtils.chmod(0755, "script.sh")

# Make files read-only
FileUtils.chmod(0444, "readonly/")

# Make files and directories writable
FileUtils.chmod_R(0644, "public/")
require "fileutils"

# Create a symbolic link
FileUtils.ln_s("target", "link")

# Create symbolic link (overwrite existing)
FileUtils.ln_sf("target", "link")

# Create hard link
FileUtils.ln("target", "hardlink")

# Remove link
FileUtils.rm("link")

Verbose Mode

Logging Operations

require "fileutils"

# Enable verbose output
FileUtils.verbose do
  FileUtils.cp("source.txt", "dest.txt")
  FileUtils.mkdir("new_folder")
end
# Prints each operation to stdout

Dry Run

Testing Operations

require "fileutils"

# Preview without executing
FileUtils.mkdir_p("new/nested/folder", dryrun: true)
# Prints what would happen but does nothing

Practical Examples

Backup Script

require "fileutils"

def backup_directory(source, destination)
  timestamp = Time.now.strftime("%Y%m%d_%H%M%S")
  backup_name = File.basename(source) + "_" + timestamp
  
  FileUtils.mkdir_p(destination)
  FileUtils.cp_r(source, File.join(destination, backup_name))
  
  puts "Backup created: #{backup_name}"
end

backup_directory("data/", "backups/")

Clean Temporary Files

require "fileutils"

def clean_temp_files(directory)
  Dir.glob(File.join(directory, "*.tmp")).each do |file|
    FileUtils.rm_f(file)
    puts "Removed: #{file}"
  end
end

clean_temp_files("workspace/")

Deploy Application

require "fileutils"

def deploy(source, target)
  # Backup current version
  if File.exist?(target)
    FileUtils.mv(target, "#{target}.bak")
  end
  
  # Copy new version
  FileUtils.cp_r("#{source}/.", target)
  
  # Set permissions
  FileUtils.chmod_R(0755, File.join(target, "bin"))
  FileUtils.chmod_R(0644, File.join(target, "public"))
  
  puts "Deployed successfully!"
end

deploy("build/", "/var/www/app/")

Common Options

These options work across most FileUtils methods:

OptionDescription
forceDon’t raise error if destination exists
verbosePrint operations to stdout
preservePreserve timestamps and permissions
noopDon’t actually perform the operation
dryrunSame as noop
FileUtils.cp("file.txt", "dest/", force: true, preserve: true, verbose: true)

See Also

  • File — for low-level file operations
  • Dir — for directory traversal and listing
  • ERB — templating for generating files programmatically