我需要重命名 SD 卡上的文件,以便能够将多个子文件夹的内容复制到我的硬盘上。首先,我需要通过它们的扩展名找到它们.MOD
(我可以使用 来做到这一点find ./path/*.MOD2
,因为它们位于不同的目录中)。
我需要重命名它们,因为它们都有类似的名字MOV001.MOD
,MOV002.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
将dir1
etc 替换为文件目录的实际路径
在检查这是否满足您的要求后,删除echo
(只是为了测试),然后实际重命名文件。
这将对文件进行编号01.MOD
,02.MOD
等。如果您有超过 99 个文件,请替换%02d
为%03d
以获取001.MOD
等
解释:
n=0
这只是设置n
为0
我希望 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
%02d
printf
.
*
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)