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

问题描述:

我知道这已被多次覆盖,但我仍然无法得到这个特定方面的良好解决方案。我在bash和DOS中都有同样的问题。我有许多名为abcYYMMDDf.csv的.csv文件的文件,我想将文件名更改为与创建日期相对应的YYMMDD部分。注意YYMMDD之后的“f”,所以我真的想要一个相当于excel的mid()来取中间日期。批量重命名替换为部分原始文件名DOS和Bash

在bash我了解重命名功能,和通配符*我试着

rename abc*f.csv *.csv abc* 

变化以为*将站在为YYMMDD但显然事实并非如此。 我看到了另一种涉及选择s /([a-z] *)的方法,但是它只会确保整个文件名?

在DOS我试过

ren abc*f.csv *.csv 

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版本;你最好在另一个问题中提问。

+0

非常好,非常感谢。我使用了重命名的组合来移除abc,然后使用f的第一部分答案。我第一次尝试第二个循环,它不断给我一个关于没有输出文件的错误消息,有没有我没有指定在那个循环中会返回该消息? – stackmeistergeneral 2012-07-31 13:04:29

+0

和往常一样,我在sed电话中犯了一个错误。固定。 – chepner 2012-07-31 13:12:36

对于庆典的一部分(有两个步骤):

rename abc "" abc* 
rename f.csv .csv *f.csv 

应该工作,因为你要替换与空字符串 “ABC” 的一部分(即删除abc部分)。使用重命名,您只需指定要替换的部分,而不是整个文件名(有关详细信息,请参阅重命名手册页)。

第二步需要删除尾部'f'。

对于DOS部分:

我不认为你将能够解决,只有重命名。看看Powershell的一些命令可能是值得的...

+0

好的,这听起来很简单,但在这种情况下,在YYMMDD之后我也希望同时删除它。另外,我不需要用这些命令指定文件扩展名吗? – stackmeistergeneral 2012-07-31 10:17:25

+0

不,你不需要指定文件扩展名:文件扩展名在系统下没有固有含义(据我所知)。当然,您可以使用尾部扩展名通过glob模式进行过滤(如在第二次重命名调用中的最后一个命令行参数* f.csv中所做的那样)。 – 2012-07-31 15:05:09

对于这个问题的 “DOS” 部分:假设你是在Windows上使用命令提示符(cmd.exe的),而不是真正的DOS中使用command.com

@echo off 
setlocal enableDelayedExpansion 
for %%F in (abc*f.csv) do (
    set "name=%%F" 
    ren "%%F" "!name:~1,6!.csv" 
) 


更新

REN如何使用通配符的规则可以在How does the Windows RENAME command interpret wildcards?找到。不幸的是,这些规则对这种情况没有帮助。

+0

是的只是命令提示符,这工作谢谢!我不知道这个shell可能会比重命名更加痛苦。 – stackmeistergeneral 2012-07-31 15:18:19

我有一个DOS解决方案,你可以创建你需要在Excel中的字符串,然后复制并粘贴到命令行。它会自动执行你复制到命令行的每一行。

REN “FOLDERPATH \文件名”, “了newName”

REN "C:\Users\Charlie\Desktop\_Working General\L2795187.HH293.11.xml.csv" "HH293-11.csv" 

我创建的上述在Excel中的公式,只是贴入CMD。我想在列A中重命名每个单个文件的单元格,并且它工作得很完美。