Shell递归目录处理文件

有时候我们需要递归一个目录,处理下面的每一个文件,保存在另外一个目录下,并且还需要保持相同的目录结构。

1. 完整脚本

下面是可以完成此功能的脚本(或者此Gist),需要修改执行自定义命令部分完成对应的功能。

#!/bin/bash
# @Author: Farmer Li
# @Date:   2019-05-14 14:32:34
# @Last Modified by:   Farmer Li
# @Last Modified time: 2019-05-14 15:47:08

usage() {
    echo "Usage: ${0} source_dir target_dir"
}

recursively_processing() {
    # Strip the last separator of the path
    source_dir=${1%/}
    target_dir=${2%/}
    pattern=$3
    for source_file in $( find $source_dir -name $pattern); do
        echo "Processing file: ${source_file}"
        src_dir_full=`dirname $source_file`
        dst_dir_full=${src_dir_full/$source_dir/$target_dir}
        if [[ ! -d $dst_dir_full ]]; then
            mkdir -p $dst_dir_full
        fi
        target_file="${dst_dir_full}/`basename $source_file`"

        # Run custom command here
        echo "Output to: ${target_file}"
    done
}

if [[ $# -eq 2 ]]; then
    recursively_processing $1 $2 "*.txt"
else
    usage
    exit 1
fi

整个脚本接受两个参数,源文件夹和目标文件夹。
recursively_processing函数接受三个参数:

  1. 源文件夹
  2. 目标文件夹
  3. 文件的pattern,这里默认是"*.txt"

2.知识点

只用关注recursively_processing函数:

  1. ${str%sub_str}:将str中的最后一个sub_str删除
  2. dirname:获取路径中的目录名
  3. basename:获取路径中的文件名,包括文件名后缀
  4. ${str/sub_str_old/sub_str_new}:将str中的第一个sub_str_old替换成sub_str_new

你可能感兴趣的:(Shell递归目录处理文件)