删除目录名称中的冒号

删除目录名称中的冒号

目前,我正在使用的程序自动创建的目录包含冒号 ( :),当我尝试操作目录时会产生问题。有人能帮我先删除这个冒号,然后进入cd重命名的目录吗?(所以我想我必须将新目录名称等于一个变量?)

例子:

  • 当前目录名称:Lang-32b-Branch:Line
  • 所需目录名称:Lang-32b-BranchLine

答案1

为了手动实现这一点,您可以以一种简单的方式使用mv带有强引用的命令来确保 shell 不会将冒号解释为特殊字符:

mv 'Lang-32b-Branch:Line' 'Lang-32b-BranchLine' && cd 'Lang-32b-BranchLine'

另一种方法是使用变量和 Bash 参数扩展的功能之一,如果您希望将此目录名称更改自动更改为脚本,这可能会更有用:

dir=Lang-32b-Branch:Line
mv "$dir" "${dir//:/}"

的扩展"${dir//:/}"将用空字符替换任何出现的冒号字符,从而得到预期结果 Lang-32b-BranchLine。使用"${dir/:/}"将导致仅删除第一次出现的冒号,但这仍然适用于您给出的示例。

使用一行代码即可移动并进入目录:

dir=Lang-32b-Branch:Line ; mv "$dir" "${dir//:/}" && cd "${dir//:/}"

或者如果您希望将修改后的目录名称捕获到名为 new_dir 的变量中:

dir=Lang-32b-Branch:Line ; new_dir="${dir//:/}"; mv "$dir" "$new_dir" && cd "$new_dir"

有一份出色的 Bash 参数扩展指南可供参考这里

答案2

如果你想要一个通用命令来重命名多个文件和/或目录(带有一个或多个冒号),则可以使用rename,

rename 's/://g' *

之后,您可以cd照常进入任何目录(您修改过的目录)(不带任何引号)。


根据@DavidFoerster 和@dessert 评论中的提示替换命令行,

rename 's/://g' *\:*/
  • 如果您想将重命名操作限制在目录中,您应该在通配符星号后添加斜线。
  • 您还可以在通配符表达式中添加冒号,以将文件选择限制为文件名中包含冒号的文件,如果需要搜索大量目录,这可能会使操作更快,

编辑:

@EliahKagan 建议先用选项 -n 进行“试运行”,

rename -n 's/://g' *

它只打印出将执行哪些重命名操作。然后可以再次运行它,删除 -n 选项以实际重命名文件。这有助于避免错误,例如意外重命名了一堆实际上想保留的文件。

答案3

如果只有一个目录,您可以使用mvcd。要利用bash历史扩展以及特殊参数$_

mv Lang-32b-Branch:Line !#:$:s/:/ && cd $_

!#:$:s/:/$被替换为当前命令行 ( ) 的最后一个单词 ( ) !#,其中第一个单词:s替换为空。如果您希望每一个要删除冒号,请将其更改为(全局)。只需用最后一个命令的最后一个参数替换即可。!#:$:gs/:/g$_

相关内容