2

我在 Mac 中运行失败

mv .* *

mv .* ./*

我的文件消失得无影无踪。

如何安全地将点文件转换为非点文件?

4

6 回答 6

7
for i in `ls -d .*`; do mv $i "`echo $i | sed 's/^.//'`"; done

或者,更容易,

rename 's/^.//' `ls -d .*`

如果你的系统有它。

在 zsh 中,您可以安全地使用 .*,但在 bash 中,您必须使用ls -d .*

于 2009-05-26T21:17:42.017 回答
4

您不能mv像这样重命名多个文件。你想要的是mmv(在这里获取)。

mmv .\* \#1

您必须转义星号以防止 bash 扩展它。使用 -n 标志进行测试运行,以确保将发生的事情是您想要的。

您也可以在 shell 脚本中执行此操作,但我更喜欢mmv,因为 -n 标志显示了它会做什么。您必须将脚本更改为 echo 而不是 mv,这似乎比删除 -n 标志更危险(尤其是当您变得更复杂时。

于 2009-05-26T21:17:08.163 回答
2

棘手的部分是选择点文件而不选择“。” 和 ”..”。

  • ls .??*有时用于此目的,因为它强制文件名长度为三个或更多字符。但是,存在忽略具有短名称(例如“.x”)的点文件的风险
  • ls -d .*防止目录被扩展,但它不会过滤掉“。” 或者 ”..”
  • find可以使用该命令,如find . -maxdepth 1 -type f -name '.*'. maxdepth 将其限制为当前目录而不是子目录。-type f 将其限制为文件,消除诸如“.”之类的目录。和 ”..”。再说一次,也许您想将 .ssh 目录重命名为 ssh。

这是一种选择点文件同时避免“。”的替代方法。和 ”..”。

ls -A | sed -n 's/^\.\(.*\)/mv ".\1" "\1"/p' | bash

-A 列出所有文件和点文件,但消除“。” 和“..”对我们来说。然后 sed 命令只选择那些带有 "." 的行。作为第一个字符,并打印出适当的“mv”命令,并加上引号,以防你有一个奇怪的点文件名,其中有一个空格。

先在不带“| bash”的情况下运行它,看看生成了哪些 mv 命令。

于 2009-05-26T21:52:25.597 回答
1

我不知道你使用的是什么类型的系统,但它看起来像 unix,我会的

ls -1 .?* | 切-b1- | xargs -i{} mv .{} {}

这列出了以 . 开头但不是 . 的所有内容。或..,然后切断第一列,然后将该列表传递给移动命令

于 2009-05-26T21:18:21.577 回答
1

在 Linux 中,通常有一个可用的rename实用程序(如果我没记错的话,一个 perl 脚本):

rename 's/^.//' .*

它在 Mac 上可用。您可以按照此处的提示进行安装。

于 2009-05-27T09:59:58.547 回答
0

更简单:

对于 x in .*; 做 mv $x ${x/./}; 完毕    

于 2010-08-02T06:38:51.510 回答