GCS多文件夹下批量重命名GeoTiff文件:修正.tif.tif后缀为.tif
解决GCS中批量重命名.tif.tif文件为.tif的问题
错误原因
你之前的命令报错是因为:
gsutil mv不支持通过**通配符配合\1反向引用的方式批量替换文件名,它无法解析目标路径中的**和\1,会认为目标是一个不明确、不唯一的URL,因此抛出CommandException。
正确的批量重命名方法
方法1:Bash循环逐个重命名(最稳妥)
通过gsutil ls列出所有需要修改的文件,再用bash循环逐个处理重命名:
# 遍历所有.tif.tif文件,逐个重命名为.tif gsutil ls "gs://bucket/folders/more_folders/even_more_folders/here_4_folders_COPY/**/*.tif.tif" | while read -r old_file; do new_file="${old_file%.tif.tif}.tif" gsutil mv "$old_file" "$new_file" done
${old_file%.tif.tif}是bash参数扩展语法,作用是移除字符串末尾的.tif.tif后缀,再拼接.tif得到正确的文件名。- 如果需要并行处理提升速度,可以在循环内控制并发数(比如每10个任务并行):
# 并行处理,控制并发数为10 count=0 gsutil ls "gs://bucket/folders/more_folders/even_more_folders/here_4_folders_COPY/**/*.tif.tif" | while read -r old_file; do new_file="${old_file%.tif.tif}.tif" gsutil mv "$old_file" "$new_file" & # 每10个任务等待一次,避免并发过高触发限流 ((count++)) && ((count%10==0)) && wait done wait
方法2:结合xargs并行处理
用xargs实现批量并行重命名,适合文件数量较多的场景:
gsutil ls "gs://bucket/folders/more_folders/even_more_folders/here_4_folders_COPY/**/*.tif.tif" | xargs -I {} -P 10 gsutil mv {} "$(dirname {})/$(basename {} .tif.tif).tif"
-P 10表示同时运行10个并行任务,可根据GCS配额调整数值;dirname {}获取文件所在目录,basename {} .tif.tif移除.tif.tif后缀,再拼接.tif得到新文件名。
注意:GCS有请求频率限制,并行数不要设置过高,否则可能触发限流报错。
内容的提问来源于stack exchange,提问作者Reut
相关产品推荐
相关产品推荐

