2011-03-06 37 views
1

我有一些文件,有些莫名其妙地,但由于情有可原的情况下,收到附加到文件名前面的“。”(句点和空格)。Unix天才 - 删除“。”从一堆文件名?

我想写一个bash脚本来删除这个,但我真的不知道从哪里开始。

我可以

find dir -name ".*" 

检索所有受影响的文件的列表,但是,这就是所有我知道的。谁能帮我吗?

+0

现在,你知道,在的Linux/Unix是完全正常有文件“”在他们面前,对吗?这意味着他们“隐藏”。例如,如果您在家庭(〜)目录中输入“ls -a”,则会看到大量隐藏的目录等。 – 2011-03-06 00:48:15

+0

对,它们不应该是:P – cemulate 2011-03-06 00:50:18

+0

如果你做了很多这样的事情,我在很多年前写了一个非常Perl的程序,可以让你使用替换进行批量重命名:http://pastebin.com/BZ3MzMcn(例如:'regmv * s/foo/bar /') – Blrfl 2011-03-06 13:05:59

回答

2
find dir -type f -regex ".*/[.] .*" -exec rename ". " "" {} \; 

查找目录内的所有内容,其中名正则表达式匹配".*/[.] .*" - “什么,斜线,点,空间,任何东西”

对于每一个找到的文件,执行:“。‘rename ". " "" filename其变为’ “在文件中被称为filename

+0

我无法获得此命令的工作。我试着运行“find dir -name”[。]。*“并且什么也没有发现,而使用”。*“打开了所有受影响的文件,然后在插入命令的其余部分的同时尝试了它,在(eval 1)第1行,在“。”附近给了我一个重复的语法错误,你能否解释一下重命名正在做什么?我正在努力学习 – cemulate 2011-03-06 00:55:38

+0

想了解更多关于'rename' type'man rename '在终端中,这是'rename'手册(因此是'man'),通常是第一个查找命令信息的地方。 – 2011-03-06 00:59:01

+0

使用这种新的查找形式。 – Erik 2011-03-06 00:59:35

2

如果你有rename Perl脚本版本:

find dir -name '. *' -exec rename 's/^. //' {} \; 
1
for fn in \.\ *; do mv -T "$fn" "${fn:2}"; done 

-T是为了安全起见,即将“$ {fn:2}”视为文件而不是目录。

(测试在bash)

+1

这是解决这个问题的方法,尽管你不需要逃避这个问题。 '。\ *'将足以匹配问题中描述的文件;点在bash的路径名扩展中不是特殊字符。 – ghoti 2016-02-02 13:20:48