linux cp命令

命令简介

cp 命令是 Linux 系统中最基本和最常用的文件操作命令之一,用于复制文件和目录。它是 "copy" 的缩写,能够创建文件副本、备份重要数据、复制整个目录结构等。

注意: cp 命令在复制文件时会创建新的文件,目标文件与源文件具有相同的内容但不同的 inode 编号。

语法

cp [选项] 源文件 目标文件

或者复制多个文件:

cp [选项] 源文件... 目标目录

常用选项

选项 说明
-i 交互模式,覆盖前提示确认
-f 强制复制,直接覆盖不提示
-r, -R 递归复制目录及其内容
-a 归档模式,保留所有文件属性
-p 保留文件的修改时间、访问时间和权限
-u 更新模式,只在源文件比目标文件新时复制
-v 显示详细的复制过程
-l 创建硬链接而不是复制
-s 创建符号链接(软链接)
-b 覆盖前备份目标文件
--backup=控制 指定备份方式
-t 目录 指定目标目录

基本用法

1. 复制单个文件
# 复制文件到当前目录
cp file.txt file_backup.txt

# 复制文件到指定目录
cp file.txt /path/to/destination/

# 复制并显示详细信息
cp -v file.txt backup.txt
# 输出:'file.txt' -> 'backup.txt'
2. 复制多个文件
# 复制多个文件到目录
cp file1.txt file2.txt file3.txt /target/directory/

# 使用通配符复制多个文件
cp *.txt /backup/

# 复制特定类型的文件
cp *.jpg *.png /images/
3. 复制目录
# 递归复制整个目录
cp -r source_directory/ destination_directory/

# 复制目录并保留所有属性
cp -a original_directory/ backup_directory/

# 复制目录并显示进度
cp -rv project/ project_backup/
4. 交互式和强制复制
# 交互模式(覆盖前确认)
cp -i important_file.txt backup/
# 输出:cp: overwrite 'backup/important_file.txt'?

# 强制覆盖(不提示)
cp -f config.conf /etc/app/

# 备份模式(覆盖前创建备份)
cp -b old.txt new.txt
# 如果 new.txt 存在,会创建 new.txt~ 作为备份
5. 保留文件属性
# 保留文件权限和时间戳
cp -p source.txt destination.txt

# 归档模式(保留所有属性,用于备份)
cp -a /home/user/documents/ /backup/user_documents/

# 验证文件属性
ls -l source.txt destination.txt
# 输出:
# -rw-r--r-- 1 user user 1024 Jan 10 10:00 source.txt
# -rw-r--r-- 1 user user 1024 Jan 10 10:00 destination.txt

实际应用场景

场景1:文件备份
# 备份重要配置文件
cp -p /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup

# 备份用户数据
cp -a /home/user/documents/ /backup/user_documents_$(date +%Y%m%d)/

# 增量备份(只复制新文件)
cp -u /source/* /backup/
场景2:项目部署
# 部署网站文件
cp -r website/* /var/www/html/

# 复制并设置正确的权限
cp -a application/ /opt/myapp/
chmod +x /opt/myapp/bin/*

# 批量复制资源文件
cp images/*.png css/*.css js/*.js /var/www/static/
场景3:系统维护
# 备份日志文件
cp /var/log/syslog /backup/logs/syslog_$(date +%Y%m%d)

# 复制系统配置
cp -p /etc/hosts /etc/resolv.conf /backup/network/

# 创建临时工作副本
cp -r /var/lib/mysql /tmp/mysql_backup/
场景4:批量文件处理
#!/bin/bash
# 批量复制和重命名文件

SOURCE_DIR="/data/photos"
DEST_DIR="/shared/albums"

# 为所有图片文件添加前缀
for file in "$SOURCE_DIR"/*.jpg; do
    if [ -f "$file" ]; then
        filename=$(basename "$file")
        cp -p "$file" "$DEST_DIR/vacation_$filename"
    fi
done

echo "图片复制完成"

# 批量更改文件扩展名
for file in "$SOURCE_DIR"/*.jpeg; do
    if [ -f "$file" ]; then
        basename="${file%.jpeg}"
        cp "$file" "${basename}.jpg"
    fi
done

高级用法

1. 使用 -t 选项指定目标目录
# 使用 -t 选项明确指定目标目录
cp -t /target/directory/ file1.txt file2.txt file3.txt

# 这在脚本中特别有用
files=(*.txt)
cp -t /backup/ "${files[@]}"

# 与find命令结合使用
find . -name "*.conf" -exec cp -t /backup/configs/ {} +
2. 创建链接而不是复制
# 创建硬链接(共享inode)
cp -l original.txt hardlink.txt

# 创建符号链接(软链接)
cp -s /path/to/original symlink_to_original

# 验证链接
ls -li original.txt hardlink.txt
# 输出相同的inode编号
3. 备份策略
# 使用数字备份
cp --backup=numbered important.txt backup/
# 如果 backup/important.txt 存在,会创建 backup/important.txt.~1~

# 简单备份
cp -b -S .bak file.txt destination/
# 如果目标文件存在,会创建 destination/file.txt.bak

# 带时间戳的备份
cp --backup=t file.conf /etc/
# 创建类似 file.conf.~2024-01-10~ 的备份
4. 在脚本中使用cp
#!/bin/bash
# 安全的文件复制脚本

safe_copy() {
    local src=$1
    local dest=$2

    # 检查源文件是否存在
    if [ ! -e "$src" ]; then
        echo "错误: 源文件 '$src' 不存在"
        return 1
    fi

    # 检查目标目录是否可写
    local dest_dir=$(dirname "$dest")
    if [ ! -w "$dest_dir" ] && [ ! -w "$(pwd)" ]; then
        echo "错误: 目标目录不可写"
        return 1
    fi

    # 执行复制操作
    if cp -i "$src" "$dest"; then
        echo "成功复制: $src -> $dest"
        return 0
    else
        echo "复制失败: $src -> $dest"
        return 1
    fi
}

# 使用函数
safe_copy "important.txt" "backup/important.txt"

安全使用建议

1. 防止数据丢失
# 在 ~/.bashrc 中设置别名,默认使用交互模式
alias cp='cp -i'

# 重要操作前先检查目标
ls -l destination_directory/
cp -i important_file.txt destination_directory/

# 使用备份选项
cp -b confidential.data backup/
2. 权限管理
# 复制后验证权限
cp -p source.txt dest.txt
ls -l source.txt dest.txt

# 确保敏感文件权限正确
cp secret.txt /secure/location/
chmod 600 /secure/location/secret.txt

# 复制目录时保持权限结构
cp -a sensitive_data/ backup/

与其他命令的比较

命令 用途 特点
cp 复制文件/目录 创建文件副本,支持各种属性保留选项
mv 移动/重命名文件 移动文件位置或重命名,不创建副本
rsync 远程同步 增量复制,支持网络传输,更高效
dd 底层数据复制 块级复制,适合磁盘映像等操作
ln 创建链接 创建文件链接,不复制实际数据

实用技巧

  • 使用 cp -i 作为默认别名可以防止意外覆盖文件
  • 对于备份操作,使用 cp -a 保留所有文件属性
  • 使用 cp -u 可以避免不必要的复制,提高效率
  • 在脚本中使用 cp -f 可以避免交互提示
  • 使用 cp -v 可以查看详细的复制过程
  • 对于大文件复制,考虑使用 rsync 以获得更好的性能
  • 使用 cp --backup 可以在覆盖前自动备份

注意事项

  • cp 命令默认会覆盖目标文件而不警告(除非使用 -i 选项)
  • 复制目录时必须使用 -r-a 选项
  • cp 不会复制挂载点目录中的内容
  • 使用通配符时要小心,确保匹配正确的文件
  • 在低磁盘空间环境下复制大文件时要特别小心
  • cp 不会跟随符号链接到目录,除非使用 -L 选项
  • 重要文件操作前建议先备份