如何修改基于mapfile的bash代码为每个文件调用rsync同步到目标路径
两种mapfile代码的rsync同步修改方案
原有代码已经正确通过空分隔的方式把随机选中的文件名读入了fl数组,本身兼容带空格、换行等特殊字符的文件名,不需要修改原有生成文件列表和mapfile读取的逻辑,只需要追加遍历数组执行rsync的代码即可。
第一种(find实现版本)完整代码
# 先按需定义你的变量 dpath="/你的目标同步路径" nf=10 # 要随机选取的文件数量 inclnm=( -name "*.doc" -o -name "*.pdf" ) # 替换为你实际的find匹配规则 # 原有读取逻辑保持不变 mapfile -d '' fl < <( find "$dpath" -maxdepth 1 -type f "${inclnm[@]}" | shuf -z -n "$nf" ) # 新增rsync同步逻辑 for f in "${fl[@]}"; do # rsync参数按需调整,需要远程同步就将目标改为 user@ip:远程路径 rsync -av -- "$f" "$dpath/" done
第二种(shuf直接传参版本)完整代码
# 先按需定义你的变量 dpath="/你的目标同步路径" nf=10 # 要随机选取的文件数量 inclnm=( ./* ) # 替换为你实际的待选文件列表 # 原有读取逻辑保持不变 mapfile -d '' fl < <( shuf -z -n "$nf" -e "${inclnm[@]}" ) # 新增rsync同步逻辑 for f in "${fl[@]}"; do rsync -av -- "$f" "$dpath/" done
注意事项
- 所有变量包裹双引号、rsync参数前加
--,是为了兼容以-开头的特殊文件名,避免被识别为命令参数 - 目标路径末尾的斜杠是rsync的标准写法,保证文件被放到目标目录下,而不是被重命名为目标目录的名字
- 如果需要同步后删除源文件,可给rsync添加
--remove-source-files参数实现移动效果 - 如果需要静默执行,去掉rsync的
-v参数即可
内容的提问来源于stack exchange,提问作者Nigel
相关产品推荐
相关产品推荐

