如何更改目录中的文件扩展名

如何更改目录中的文件扩展名

我在具有扩展名的目录中有许多文件。

.text(2)
.text(1)

我想从扩展中删除数字,输出应该是这样的

.text 
.text

有人可以帮我提供这个 shell 脚本吗?我正在使用 CentOs 6.3。

答案1

在保存文件的文件夹中启动单行命令或更改命令的路径find。在以下示例中,find .路径为.(点)。

测试:

find . -type f -print0 | xargs -I{} -0 rename -v -n  's/\([0-9]+\)$//' {}

重命名为:

find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)$//' {}

该命令以递归方式查找所有文件并删除(<any_number>)文件名末尾的所有出现的 。

删除$in's/\([0-9]+\)$//'以删除文件名中某处的所有出现的位置,例如:

find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)//' {}

例子:

% ls -oga
-rw-rw-r--  1 0 Jun 10 09:34 .foo(1)
-rw-rw-r--  1  0 Jun 10 09:34 .bar(2)
% find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)$//' {}
% ls -aog
-rw-rw-r--  1    0 Jun 10 09:34 .foo
-rw-rw-r--  1    0 Jun 10 09:34 .bar

答案2

for i in *.text*; do mv "$i" "$(echo "$i" | sed 's/([0-9]\{1,\})$//')"; done 

只需根据需要更改扩展名(.text 或任何其他扩展名)。

答案3

使用python

#!/usr/bin/env python2
import os, re
for root, dirs, files in os.walk('/path/to/directory'):
    for f in files:
        oldname = os.path.join(root, f)
        newname = os.path.join(root, re.search(r'(?<=/)[^/]+(?=\(\d+\)$)', oldname).group())
        os.rename(oldname, newname)

考虑到文件名的第一部分不同(正如您已经提到的),因此没有覆盖的机会。

  • os.walk将遍历上述目录下的所有子目录

  • oldname将包含要更改的文件的名称。os.path.join将通过以下方式添加文件名和目录路径:os.path.join

  • newnameoldname将包含将要更改的名称。这里我们使用re模块获取文件名,然后通过以下方式将文件名添加到目录路径中:os.path.join

  • os.rename将简单地重命名文件。

前 :

foo
├── 1 spam.text(1)
├── 1.text(23)
└── bar
    ├── 1 egg.text(10)
    └── 3test.text(5)

后 :

foo
├── 1 spam.text
├── 1.text
└── bar
    ├── 1 egg.text
    └── 3test.text

答案4

这是“附加评论”,本身并不是完整的答案。

这是一种“解释”小概念的非常长的方式——除非读者错过了重点,否则它会显得冗长而迂腐。

简短的摘要:

如果有多个名称相同的文件,如 foo.txt[(n)]

  • foo.txt, foo.txt(1) -- 重命名 -- > 无变化
    看上去什么都没发生。但事实确实如此。

  • foo.txt(1), foo.txt(2) -- 重命名 --> foo.txt, foo.txt(2) (可能)
    一个文件重命名,一个未重命名。


更长:

您说您没有重复的文件。
您可能是对的
,但是 - 如果您知道以下内容,则显而易见,但如果您以前没有遇到过,则这是一个微妙的陷阱。

就系统而言

foo.txt == foo.txt(1) == foo.txt(2) = 等等

无论文件内容或大小。

即,如果您有两个文件名为 foo.txt 的文件,后面带有或不带有 (n),则系统会认为它们是重复的和/或它们是重复的。
无论哪种情况,重命名过程都会失败。

如果重命名过程会创建两个同名文件,则在尝试创建第一个重复文件时会失败。但是

在一种情况下,失败不会产生任何输出,因此看起来“什么都没发生”,而实际上“由于名称冲突而导致复制失败”。这种情况发生在一个文件没有 (n) 后缀而另一个文件有后缀时。
例如,如果现有文件是 foo.txt 和 foo.txt(1),则重命名 foo.txt(1) 会创建一个重复文件(如果允许的话),因此不会发生,因此不会采取任何行动。foo.txt
、foo.txt(1) -> 无变化

但是如果现有文件例如是 foo.txt(1) 和 foo.txt(2),则重命名 foo.txt(1) 不会创建重复,因此会发生这种情况,但是随后重命名 foo.txt(2) 会创建重复(如果允许),因此不会发生第二次文件重命名操作。foo.txt
(1),foo.txt(2) -> foo.txt,foo.txt(2)(可能)

相关内容