重命名不同目录中具有相同名称的文件,以便每个文件都有唯一的(编号的)名称

重命名不同目录中具有相同名称的文件,以便每个文件都有唯一的(编号的)名称

我需要重命名 SD 卡上的文件,以便能够将多个子文件夹的内容复制到我的硬盘上。首先,我需要通过它们的扩展名找到它们.MOD(我可以使用 来做到这一点find ./path/*.MOD2,因为它们位于不同的目录中)。

我需要重命名它们,因为它们都有类似的名字MOV001.MODMOV002.MOD其他目录中还有其他视频,但名称相似。这是我的相机创建的。重命名后,我可以通过一个命令将它们复制到我的硬盘上。

因为它们的实际名称,当我使用时cp ./path/*.MOD new-path,结果会覆盖类似名称的文件。

我该如何解决这个问题?

答案1

这个小脚本可以在不移动文件的情况下重命名文件

n=0; for files in dir1/*.MOD dir2/*.MOD dir3/*.MOD; do printf -v new "${files/MOV*./%02d.}" "$((++n))"; echo mv -v "$files" "$new"; done

或者更易读的是:

#!/bin/bash
n=0
for files in dir1/*.MOD dir2/*.MOD dir3/*.MOD; do
   printf -v new "${files/MOV*./%02d.}" "$((++n))"
   echo mv -v -- "$files" "$new"
done

dir1etc 替换为文件目录的实际路径

在检查这是否满足您的要求后,删除echo(只是为了测试),然后实际重命名文件。

这将对文件进行编号01.MOD02.MOD等。如果您有超过 99 个文件,请替换%02d%03d以获取001.MOD


解释:

n=0这只是设置n0我希望 bash 开始计数的地方。

for files in dir1/*.MOD dir2/*.MOD dir3/*.MOD

循环for可以依次对每个文件迭代执行命令。语法是for [variable] in [these things I want to do something to] ; do [command(s)] $[variable]; done我已经调用了变量files并使用 glob 找到了您的文件:*.MOD由 shell 扩展为名称以.MOD(*匹配任何字符)结尾的任何文件

printf -v new

printf可以以固定宽度格式化新数字,以便于排序。new是另一个变量 - 这是文件的新名称。

"${files/MOV*./%02d.}" "$((++n))"

files引用之前的变量并用递增数字的结果替换MOV*(记住是任何字符) (这是来自脚本的第一行,每次在文件上执行循环时增加一),使用代码格式化,表示固定宽度的两位数字 01、02 等的十进制数。搜索和替换模式包括停止匹配整个文件名并从而删除扩展名。*$((++n))n%02dprintf.*

echo mv -v -- "$files" "$new"

我添加echo只是为了测试 - 这显示了将要做什么而不是实际执行。对结果满意时删除回显以实际执行命令。

mv重命名或移动文件;其语法是mv oldname newname。我添加了-v标志,指示mv“详细”并报告每个操作。我添加--只是为了安全 - 这指示mv不接受任何其他选项,这会阻止以 开头的任何文件名-被解释为命令的选项 - 在您的情况下不需要,但是一种很好的做法。

变量指定的每个文件files都会mv被赋予在变量中创建的唯一名称new。我们使用$来引用变量,这些变量应该放在“双引号”中,以防止 shell 对文件名进行任何其他扩展 - 这可以防止文件名中的特殊字符或空格导致问题。

答案2

您可以从递归目录(包括所有子目录)复制它们,搜索扩展名并使用以下脚本一步重命名它们。

摘自我用来确保不是从递归目录复制文件时覆盖文件:

#!/usr/bin/env python3
import os
import shutil
import sys

dr = sys.argv[1]
new_dir = sys.argv[2]

for root, dirs, files in os.walk(dr):
    for name in files:
        if name.lower().endswith(".mod"): # for your extension
            n = 1; name_orig = name
            while os.path.exists(new_dir+"/"+name):
                name = "duplicate_"+str(n)+"_"+name_orig
                n = n+1
            newfile = new_dir+"/"+name
            shutil.copy(root+"/"+name_orig, newfile)

将脚本复制到一个空文件中,将其保存为nodupes.py,并使用输入(源)和输出目录作为参数运行它:

python3 /path/to/nodupes.py /path/to/sourcedir /path/to/outputdir

它将重命名类似名称的文件,例如:

在此处输入图片描述

当然,除了duplicate_,脚本还可以更改为使用任何数字(或仅仅是数字)。

通用版本,不是仅搜索一个扩展名,将是:

#!/usr/bin/env python3
import os
import shutil
import sys

dr = sys.argv[1]
new_dir = sys.argv[2]

for root, dirs, files in os.walk(dr):
    for name in files:
        n = 1; name_orig = name
        while os.path.exists(new_dir+"/"+name):
            name = "duplicate_"+str(n)+"_"+name_orig
            n = n+1
        newfile = new_dir+"/"+name
        shutil.copy(root+"/"+name_orig, newfile)

相关内容