自动重命名文件
Automatic renaming of files
我想在我的操作系统上批量重命名同一文件夹中的许多文件。
我有一个包含两个变量的数据集:oldname
和 newname
。
数据集中的文件名多于需要重命名的实际文件,所以我想构建一些与数据集中的观察结果相匹配的文件,重命名匹配的文件,然后将其移动到新位置。
例如,我在一个位置有三个文件:
filepath/to/my/files/file1.jpg
filepath/to/my/files/file2.jpg
filepath/to/my/files/file3.jpg
具有字符串变量的数据集:
Dataset
newname oldname
a pink files/file1.jpg
b blue files/file4.jpg
c purple files/file6.jpg
d green files/file3.jpg
e red files/file2.jpg
这是程序的预期输出:
filepath/for/matches/pink.jpg
filepath/for/matches/red.jpg
filepath/for/matches/green.jpg
我需要使用 !
运算符来实现我想要的吗?
编辑:
到目前为止,我已经有了移动火柴但不能重命名它们的方法:
global dir "/filepath"
global old "$dir/to/my/"
global new "$dir/for/matches"
ssc install mvfiles
preserve
keep if oldname!=.
foreach i in oldname{
mvfiles, infolder($old) outfolder($new) match(substr(`i',6,9))
}
restore
不一定。您只需使用 copy
命令即可实现您想要的效果。
以下应该有效:
clear
input str1 letter str10 newname str15 oldname
"a" "pink" "files/file1"
"b" "blue" "files/file4"
"c" "purple" "files/file6"
"d" "green" "files/file3"
"e" "red" "files/file2"
end
local inpath "filepath/to/my/files/"
local outpath "different/filepath/for/matches/"
local files : dir "`inpath'" files "*.jpg"
local obs = _N
foreach fil of local files {
forvalues i = 1 / `obs' {
local oldname = oldname[`i']
if substr("`fil'", 1, strpos("`fil'", ".") - 1) == substr("`oldname'", 7, .) {
local newname = newname[`i']
copy "`inpath'`fil'" " `outpath'`newname'.jpg"
}
}
}
只需将本地宏 inpath
和 outpath
替换为您想要的路径即可。
注意,如果你也想在复制后删除文件,那么只需在copy
命令后添加以下内容:
erase "`inpath'`fil'"
我想在我的操作系统上批量重命名同一文件夹中的许多文件。
我有一个包含两个变量的数据集:oldname
和 newname
。
数据集中的文件名多于需要重命名的实际文件,所以我想构建一些与数据集中的观察结果相匹配的文件,重命名匹配的文件,然后将其移动到新位置。
例如,我在一个位置有三个文件:
filepath/to/my/files/file1.jpg
filepath/to/my/files/file2.jpg
filepath/to/my/files/file3.jpg
具有字符串变量的数据集:
Dataset
newname oldname
a pink files/file1.jpg
b blue files/file4.jpg
c purple files/file6.jpg
d green files/file3.jpg
e red files/file2.jpg
这是程序的预期输出:
filepath/for/matches/pink.jpg
filepath/for/matches/red.jpg
filepath/for/matches/green.jpg
我需要使用 !
运算符来实现我想要的吗?
编辑:
到目前为止,我已经有了移动火柴但不能重命名它们的方法:
global dir "/filepath"
global old "$dir/to/my/"
global new "$dir/for/matches"
ssc install mvfiles
preserve
keep if oldname!=.
foreach i in oldname{
mvfiles, infolder($old) outfolder($new) match(substr(`i',6,9))
}
restore
不一定。您只需使用 copy
命令即可实现您想要的效果。
以下应该有效:
clear
input str1 letter str10 newname str15 oldname
"a" "pink" "files/file1"
"b" "blue" "files/file4"
"c" "purple" "files/file6"
"d" "green" "files/file3"
"e" "red" "files/file2"
end
local inpath "filepath/to/my/files/"
local outpath "different/filepath/for/matches/"
local files : dir "`inpath'" files "*.jpg"
local obs = _N
foreach fil of local files {
forvalues i = 1 / `obs' {
local oldname = oldname[`i']
if substr("`fil'", 1, strpos("`fil'", ".") - 1) == substr("`oldname'", 7, .) {
local newname = newname[`i']
copy "`inpath'`fil'" " `outpath'`newname'.jpg"
}
}
}
只需将本地宏 inpath
和 outpath
替换为您想要的路径即可。
注意,如果你也想在复制后删除文件,那么只需在copy
命令后添加以下内容:
erase "`inpath'`fil'"