递归练习3 从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中

该博客介绍如何使用递归方法从一个文件夹复制所有内容到另一个文件夹。通过调用getDir()方法,详细阐述了递归在处理目录复制问题中的应用。

转载请注明出处


getDir();方法详见练习1

package com.heima.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test3 {

	/**
	 * 需求:3,从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
	 * 
	 * 把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
	 * 分析:
	 * 1,在目标文件夹中创建原文件夹
	 * 2,获取原文件夹中所有的文件和文件夹,存储在File数组中
	 * 3,遍历数组
	 * 4,如果是文件就用io流读写
	 * 5,如果是文件夹就递归调用
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		File src = Test1.getDir();
		File dest = Test1.getDir();
		if(src.equals(dest)) {
			System.out.println("目标文件夹是源文件夹的子文件夹");
		}else {
			copy(src,dest);
		}
	}
	/*
	 * 把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
	 * 1,返回值类型void
	 * 2,参数列表File src,File dest
	 */
	public static void copy(File src, File dest) throws IOException {
		//1,在目标文件夹中创建原文件夹
		File newDir = new File(dest, src.getName());
		newDir.mkdir();
		//2,获取原文件夹中所有的文件和文件夹,存储在File数组中
		File[] subFiles = src.listFiles();
		//3,遍历数组
		for (File subFile : subFiles) {
			//4,如果是文件就用io流读写
			if(subFile.isFile()) {
				BufferedInputStream bis = new BufferedInputStream(new FileInputStream(subFile));
				BufferedOutputStream bos = 
						new BufferedOutputStream(new FileOutputStream(new File(newDir,subFile.getName())));
				
				int b;
				while((b = bis.read()) != -1) {
					bos.write(b);
				}
				
				bis.close();
				bos.close();
			//5,如果是文件夹就递归调用
			}else {
				copy(subFile,newDir);
			}
		}
	}
}

 

<think>好的,用户想了解如何在Linux自动化编译脚本中实现文件夹的拷贝。我需要详细说明步骤,并确保使用正确的命令和格式。 首先,应该确定用户是否熟悉基本的Linux命令。不过问题中提到的是自动化编译脚本,所以可能用户有一定的脚本编写经验。我需要介绍cp命令的基本用法,包括递归复制和覆盖选项,因为这些在自动化场景中很重要。 接下来,可能需要考虑权限问题,是否需要使用sudo。不过自动化脚本中使用sudo可能会涉及密码输入的问题,所以需要提醒用户注意权限设置,或者建议在脚本中提前处理权限。 然后,应该给出一个具体的脚本示例,比如使用cp -r命令,并解释每个参数的作用。同时,提醒用户注意路径的正确性,绝对路径和相对路径的区别,以及目标文件夹是否存在的情况。 外,可能需要提到其他方法,比如rsync,特别是当需要增量同步或保留更多文件属性时。不过对于简单的拷贝任务,cp可能已经足够,但rsync在某些情况下更高效,尤其是在处理大文件夹或需要网络传输时。 还要注意错误处理,比如检查源文件夹是否存在,目标是否可写,以及是否在拷贝失败时进行适当的处理。这些在自动化脚本中很重要,可以增强脚本的健壮性。 最后,总结关键点,确保用户能够根据需求选择合适的命令,并正确应用到他们的编译脚本中。需要保持回答结构清晰,分步骤说明,并给出示例,这样用户更容易理解和应用。</think>在 Linux 自动化编译脚本中实现文件夹拷贝,可以通过以下步骤完成(使用 `cp` 命令为核心): **1. 基础命令格式** ```bash cp -r <源文件夹路径> <目标文件夹路径> ``` - `-r` 参数:递归复制(必须用于目录拷贝) - 若目标文件夹已存在:会将源文件夹复制到目标文件夹内部 - 若目标文件夹不存在:会创建目标文件夹并复制内容 **2. 典型应用场景示例** ```bash #!/bin/bash # 示例1:拷贝到同级目录(目标文件夹不存在) cp -r ./src ./src_backup # 示例2:拷贝到父级目录(覆盖已存在内容) cp -rf ../old_project/assets ./build/ # 示例3:使用绝对路径 cp -r /home/user/configs /mnt/backup/ ``` **3. 关键参数说明** | 参数 | 作用 | |------|-----------------------------| | `-r` | 递归复制(必须用于文件夹) | | `-f` | 强制覆盖已有文件(无提示) | | `-v` | 显示详细操作过程(调试时推荐) | | `-p` | 保留文件属性(时间戳、权限等) | **4. 注意事项** - 权限问题:若目标目录需要管理员权限,需使用 `sudo cp -r ...` - 路径规范: - 使用绝对路径 `/path/to/dir` 更可靠 - 相对路径需注意执行脚本时的当前目录 - 特殊符号:路径含空格时要用引号包裹 `cp -r "source dir" "dest dir"` **5. 增强版方案(使用 rsync)** 当需要增量同步或网络传输时更高效: ```bash rsync -avh --progress /source/folder/ /destination/folder/ ``` - `-a`:归档模式(保留所有属性) - `-v`:显示详细信息 - `-h`:友好单位显示 - 末尾斜杠 `/` 的区别:带斜杠拷贝目录内容,不带斜杠拷贝目录本身 **6. 完整脚本示例** ```bash #!/bin/bash # 定义路径 SRC_DIR="./build" DEST_DIR="/var/www/html" # 检查源目录是否存在 if [ ! -d "$SRC_DIR" ]; then echo "错误:源目录 $SRC_DIR 不存在" exit 1 fi # 执行拷贝(带错误检测) if cp -rvf "$SRC_DIR" "$DEST_DIR"; then echo "成功拷贝 $SRC_DIR 到 $DEST_DIR" else echo "拷贝操作失败!" exit 1 fi ``` 根据实际需求选择方案: - 简单拷贝:使用 `cp -r` - 需要保留属性/增量同步:使用 `rsync` - 需要错误处理:添加条件判断和退出码检测
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值