我在具有扩展名的目录中有许多文件。
.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
newname
oldname
将包含将要更改的名称。这里我们使用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)(可能)