1

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

在 bash 中,我了解重命名功能,以及我尝试过的 * 通配符

rename abc*f.csv *.csv abc*

认为 * 会代表 YYMMDD 但显然它没有。我看到了另一种涉及选择 s/([az]*) 的方法,但这肯定会占用整个文件名吗?

在DOS我试过

ren abc*f.csv *.csv
4

4 回答 4

2

对于问题的“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 如何使用通配符的规则,请参阅 Windows RENAME 命令如何解释通配符?. 不幸的是,这些规则在这种情况下没有帮助。

于 2012-07-31T13:55:29.733 回答
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 版本;你最好在一个单独的问题中提出这个问题。

于 2012-07-31T12:09:28.723 回答
0

对于 bash 部分(有两个步骤):

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

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

第二步负责删除尾随的“f”。

对于 DOS 部分:

我认为您无法仅通过重命名来解决该问题。看看一些 Powershell 命令可能是值得的......

于 2012-07-31T10:11:54.950 回答
0

我有一个针对 DOS 的解决方案,您可以在 excel 中创建所需的字符串,然后将它们复制并粘贴到命令行中。它将自动执行您复制到命令行中的每一行。

REN "文件夹路径\文件名" "newName"

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

我用公式在 excel 中创建了上述内容,然后将其粘贴到 cmd 中。我想在 A 列中重命名的每个文件的一个单元格,它工作得很好。

于 2016-02-04T18:11:27.910 回答