### Shell脚本实现从文件夹中递归复制文件 #### 背景介绍 在日常工作中,有时我们可能需要从多层嵌套的文件夹结构中提取特定的文件或者进行数据整理工作。对于这种需求,手动操作显然是低效且耗时的。此时,利用Shell脚本实现自动化处理便显得尤为重要。本文将详细介绍一个实用的Shell脚本,该脚本能够从多层级(例如十层左右)的文件夹结构中递归复制所有文件到指定的目标目录。 #### 需求分析 假设我们的文件系统中有如下结构: ``` dir1 ├── a │ ├── b │ │ └── file1 │ └── file2 ├── c │ └── d │ ├── e │ │ └── file4 │ └── file3 └── file5 ``` 我们的目标是从这个结构中提取所有的文件,并将它们放置在一个新的目录中。为了实现这一目标,我们可以编写一个Shell脚本来自动完成这项任务。 #### 脚本详解 ### 脚本结构 脚本 `getfilefromdir.sh` 的结构如下所示: ```bash #!/bin/bash # desc: get files from directory # example: sh getfilefromdir.sh <source_dir> <target_dir> INIT_PATH=${1%/} SAVE_PATH=${2%/} # 检查并创建目标路径 function check_save_path() { if [ ! -d "$SAVE_PATH" ]; then mkdir -p "$SAVE_PATH" fi touch "$SAVE_PATH/.log" } # 递归复制文件 function get_file_from_dir() { for file in "$1"/*; do if [ -d "$file" ]; then get_file_from_dir "$file" else local path="$file" local name=$(basename "$path") if [ ! -f "$SAVE_PATH/$name" ]; then echo "Copying $path to $SAVE_PATH/$name" cp "$path" "$SAVE_PATH/" else echo "$path already exists." echo "$path" >> "$SAVE_PATH/.log" 2>&1 fi fi done } # 主函数 function main() { check_save_path get_file_from_dir "$INIT_PATH" } main ``` #### 代码解析 1. **脚本注释**:脚本开头提供了简短的描述和使用示例,便于用户了解脚本的功能及用法。 2. **变量定义**:定义了两个变量 `INIT_PATH` 和 `SAVE_PATH`,分别表示源目录和目标目录。 3. **检查并创建目标路径**: - 使用 `check_save_path` 函数检查目标路径是否存在,如果不存在则创建。 - 创建一个日志文件 `.log`,用于记录已存在的文件,避免重复复制。 4. **递归复制文件**: - 定义了 `get_file_from_dir` 函数,用于递归地遍历每个子目录。 - 对于每个文件或子目录,判断是否为目录,如果是,则递归调用 `get_file_from_dir`;如果不是,则复制文件。 - 在复制文件之前,先检查目标路径下是否存在同名文件,如果存在,则将其信息写入日志文件。 5. **主函数**:`main` 函数作为脚本的入口,首先调用 `check_save_path` 函数创建目标路径,然后调用 `get_file_from_dir` 函数开始复制过程。 #### 运行脚本 要运行此脚本,只需在命令行中输入以下命令: ```bash sh getfilefromdir.sh dir1/dir2 target_directory ``` 其中 `dir1/dir2` 是源目录,而 `target_directory` 是目标目录。注意,目标目录不需要提前创建,脚本会自动创建它。 #### 结果展示 执行完脚本后,你会看到目标目录 `target_directory` 下包含了所有从源目录递归复制过来的文件: ``` target_directory ├── file1 ├── file2 ├── file3 ├── file4 └── file5 ``` 此外,如果源目录中的某些文件已经存在于目标目录中,它们的信息会被记录在 `.log` 文件中,方便后续查看哪些文件已被跳过。 ### 总结 通过本文介绍的Shell脚本,你可以轻松地从多层级文件夹结构中递归复制文件到指定目录,极大地提高了工作效率。如果你遇到类似需求,不妨尝试一下本文提供的脚本。
- 粉丝: 4
- 资源: 921
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助