如何递归归档文件夹中的.csv/.txt文件并支持运行时传参?
递归归档指定类型文件到目标目录的tar实现方案
一、核心需求实现
要递归归档源路径下所有.csv和.txt文件到指定归档目录,同时支持运行时传入路径参数,有两种常用实现方式:
方式1:结合find命令(灵活适配复杂过滤)
编写可执行脚本,支持传入源路径和目标归档文件路径:
#!/bin/bash # 参数检查:必须传入源路径和目标归档路径两个参数 if [ $# -ne 2 ]; then echo "用法: $0 <源路径> <目标归档文件路径>" exit 1 fi SOURCE_PATH="$1" TARGET_ARCHIVE="$2" # 递归查找指定类型文件并归档 find "$SOURCE_PATH" -type f \( -name "*.csv" -o -name "*.txt" \) | tar -zcvf "$TARGET_ARCHIVE" -T -
命令解释:
find "$SOURCE_PATH" -type f \( -name "*.csv" -o -name "*.txt" \):递归遍历源路径,仅筛选普通文件(-type f),匹配.csv或.txt后缀;tar -zcvf "$TARGET_ARCHIVE" -T -:-T -表示从标准输入读取要归档的文件列表,-z启用gzip压缩,-c创建新归档,-v显示归档过程,-f指定归档文件路径。
使用方法:
- 将脚本保存为
archive_files.sh,执行chmod +x archive_files.sh赋予执行权限; - 运行时传入参数:
./archive_files.sh /Apps/agent/server/srcfile/interface/file /Apps/agent/server/backup/interface/file.tar.gz
方式2:直接使用tar内置参数(简洁高效)
无需脚本,通过tar的--include参数直接实现递归过滤,命令格式如下:
tar -zcvf <目标归档文件路径> --include="*.csv" --include="*.txt" -C <源路径> .
命令解释:
--include="*.csv" --include="*.txt":仅包含这两种后缀的文件,递归生效;-C <源路径>:切换到源目录后再打包当前目录(.),避免归档中包含完整绝对路径;- 参数化运行示例:
tar -zcvf /Apps/agent/server/backup/interface/file.tar.gz --include="*.csv" --include="*.txt" -C /Apps/agent/server/srcfile/interface/file .
二、注意事项
- 建议给目标归档文件添加
.tar.gz后缀,便于识别压缩格式; - 如果文件名包含空格等特殊字符,方式1可修改为
find "$SOURCE_PATH" -type f \( -name "*.csv" -o -name "*.txt" \) -print0 | tar -zcvf "$TARGET_ARCHIVE" -T - --null,避免解析错误; - 若不需要压缩,去掉
-z参数即可生成未压缩的tar包。
内容的提问来源于stack exchange,提问作者Shalini Sharma
相关产品推荐
相关产品推荐

