如何在将多子目录同名文件移动到同一新位置时自动重命名
方案1:自动给重名文件加序号后缀(最简实现)
如果仅需避免覆盖,不需要文件名关联原文件路径,直接给mv加上--backup=numbered参数即可,重名文件会自动加上.~1~、.~2~这类递增序号后缀:
mkdir -p raml_log_files && find . -type f -name "raml-proxy.log" -exec mv --backup=numbered {} raml_log_files/ \;
注意:该方案依赖GNU版本的mv,Linux环境默认支持,macOS需要先安装coreutils包替换系统自带的mv
方案2:文件名关联原路径,既去重也可溯源
如果需要从归集后的文件名追溯原文件的路径,可选择以下两种子方案:
- 子方案A:路径转下划线拼接,可读性高
把原文件的相对路径里的分隔符/替换为下划线,直接拼到文件名中:
例如原路径mkdir -p raml_log_files find . -type f -name "raml-proxy.log" -exec bash -c ' for file in "$@"; do new_name=$(echo "$file" | tr / _) mv "$file" "raml_log_files/${new_name}" done ' bash {} +./app1/prod/logs/raml-proxy.log会被重命名为._app1_prod_logs_raml-proxy.log,从文件名就能直接看到原路径层级。 - 子方案B:路径哈希拼接,文件名长度稳定
计算原文件相对路径的哈希值取前8位拼到文件名中,适合路径特别长的场景:mkdir -p raml_log_files find . -type f -name "raml-proxy.log" -exec bash -c ' for file in "$@"; do hash=$(echo "$file" | md5sum | cut -c1-8) mv "$file" "raml_log_files/raml-proxy-${hash}.log" done ' bash {} +
内容的提问来源于stack exchange,提问作者Dariusz Urbanek
相关产品推荐
相关产品推荐

