Shell递归目录处理文件
2019-05-14 本文已影响2人
胡涂笔记
有时候我们需要递归一个目录,处理下面的每一个文件,保存在另外一个目录下,并且还需要保持相同的目录结构。
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
函数接受三个参数:
- 源文件夹
- 目标文件夹
- 文件的pattern,这里默认是
"*.txt"
2.知识点
只用关注recursively_processing
函数:
-
${str%sub_str}
:将str中的最后一个sub_str删除 -
dirname
:获取路径中的目录名 -
basename
:获取路径中的文件名,包括文件名后缀 -
${str/sub_str_old/sub_str_new}
:将str中的第一个sub_str_old替换成sub_str_new