Unix Shell脚本批量拷贝各文件夹下a.txt按目录名重命名到新目录求助
实现方案
前置操作
首先创建用来统一存放所有文件的目标目录,避免后续拷贝报错:
mkdir -p ./target_files
-p参数的作用是如果目录已存在也不会抛出错误、中断执行。
场景1:所有待处理文件夹都在当前目录下,无嵌套
直接用Shell循环处理即可:
for dir in */; do # 移除目录名末尾的斜杠,得到纯净的文件夹名称 folder_name=${dir%/} # 拷贝a.txt到目标目录,用文件夹名作为新的文件名 cp "${dir}a.txt" "./target_files/${folder_name}.txt" done
说明
*/只会匹配当前路径下的子目录,自动过滤普通文件,不会误处理其他文件- 文件名两边加双引号是兼容文件夹名带空格、特殊字符的情况
- 执行前可以把
cp替换成echo cp,先打印一遍要执行的拷贝命令,确认路径和命名符合预期再正式执行
场景2:待处理文件夹存在多层嵌套,需要全局搜索所有a.txt
用find命令遍历所有层级:
find . -type f -name "a.txt" -exec sh -c ' for file_path in "$@"; do # 提取a.txt所在文件夹的完整路径 parent_dir=$(dirname "$file_path") # 提取文件夹的最后一级名称 folder_name=$(basename "$parent_dir") # 拷贝到目标目录 cp "$file_path" "./target_files/${folder_name}.txt" done ' sh {} +
注意事项
- 如果存在多个同名文件夹,后拷贝的文件会覆盖目标目录下的同名文件,有需要可以自行在文件名上加时间戳、序号等标识避免冲突
- 如果需要保留原文件名标识,可以把目标文件名改成
${folder_name}_a.txt,按需调整即可
内容的提问来源于stack exchange,提问作者APS
相关产品推荐
相关产品推荐

