批量重命名替换为原始文件名DOS和Bash的一部分

时间:2012-07-31 09:36:07

标签: bash dos batch-rename

我知道这已被多次覆盖,但我仍然无法找到这个特定方面的良好解决方案。我在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

4 个答案:

答案 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列中重命名的每个文件的单元格,它运行良好。