我知道这已被多次覆盖,但我仍然无法找到这个特定方面的良好解决方案。我在bash和DOS中都有同样的问题。我有一个名为abcYYMMDDf.csv的许多.csv文件的文件,我想将文件名更改为YYMMDD部分,该部分对应于创建它的日期。注意YYMMDD之后的“f”,所以我真的想要相当于excel的mid()来取中间日期。
在bash中,我理解重命名功能,以及*通配符我在
上尝试了变体rename abc*f.csv *.csv abc*
认为*代表YYMMDD,但显然没有。 我看到了另一种涉及选择s /([a-z] *)的方法,但这肯定会占用整个文件名吗?
在DOS中我试过
ren abc*f.csv *.csv
答案 0 :(得分:2)
Bash参数扩展可以分别使用前缀删除和模式替换分两步剥离'abc'和'f'。
for f in abc*f.csv; do
new_f=${f#abc}
new_f=${new_f/%f.csv/.csv}
mv $f $new_f
done
您可以使用sed
代替参数扩展,只需一步即可删除'abc'和'f':
for f in abc*f.csv; do
new_f=$(echo $f | sed 's/abc\(.*\)f/\1/')
mv $f $new_f
done
我不能回答DOS版本;你可能最好在一个单独的问题中提出这个问题。
答案 1 :(得分:2)
对于问题的“DOS”部分:假设您使用命令提示符(cmd.exe)在Windows上,而不是使用command.com在真正的DOS上
@echo off
setlocal enableDelayedExpansion
for %%F in (abc*f.csv) do (
set "name=%%F"
ren "%%F" "!name:~1,6!.csv"
)
的更新强>
可以在How does the Windows RENAME command interpret wildcards?找到REN如何与通配符一起使用的规则。不幸的是,规则对这种情况没有帮助。
答案 2 :(得分:0)
对于bash部分(有两个步骤):
rename abc "" abc*
rename f.csv .csv *f.csv
应该可以工作,因为你想用空字符串替换“abc”部分(即删除abc部分)。使用重命名时,您只需要指定要替换的部分,而不是整个文件名(有关详细信息,请参阅重命名手册页)。
第二步负责删除尾随'f'。
对于DOS部分:
我认为你只能通过重命名才能解决这个问题。看一些Powershell命令可能是值得的......
答案 3 :(得分:0)
我有一个DOS解决方案,您可以在Excel中创建所需的字符串,然后将它们复制并粘贴到命令行中。它将自动执行您复制到命令行中的每一行。
REN" folderpath \ filename" "&了newName#34;
REN "C:\Users\Charlie\Desktop\_Working General\L2795187.HH293.11.xml.csv" "HH293-11.csv"
我在excel中使用公式创建了上面的内容,然后将其粘贴到cmd中。我希望在A列中重命名的每个文件的单元格,它运行良好。