删除目录名称中的冒号

Bis*_*uit 7 command-line batch-rename

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

例子:

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

Arr*_*cal 12

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

mv 'Lang-32b-Branch:Line' 'Lang-32b-BranchLine' && cd 'Lang-32b-BranchLine'
Run Code Online (Sandbox Code Playgroud)

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

dir=Lang-32b-Branch:Line
mv "$dir" "${dir//:/}"
Run Code Online (Sandbox Code Playgroud)

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

作为单行移动和 cd 进入目录:

dir=Lang-32b-Branch:Line ; mv "$dir" "${dir//:/}" && cd "${dir//:/}"
Run Code Online (Sandbox Code Playgroud)

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

dir=Lang-32b-Branch:Line ; new_dir="${dir//:/}"; mv "$dir" "$new_dir" && cd "$new_dir"
Run Code Online (Sandbox Code Playgroud)

此处提供了有关Bash 参数扩展的出色指南。

  • 什么 shell 将 `:` 解释为一个特殊字符(在历史扩展之外和一个运算符,这在这里无关紧要)? (3认同)

sud*_*dus 8

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

rename 's/://g' *
Run Code Online (Sandbox Code Playgroud)

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


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

rename 's/://g' *\:*/
Run Code Online (Sandbox Code Playgroud)
  • 如果要将重命名操作限制为目录,则应在通配符星号后添加斜杠。
  • 您还可以在通配符表达式中放置一个冒号,以将文件的选择限制为那些在文件名中包含冒号的文件,如果要搜索大量目录,这可能会使操作更快,

编辑:

@EliahKagan 建议从带有选项 -n 的“试运行”开始,

rename -n 's/://g' *
Run Code Online (Sandbox Code Playgroud)

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

  • 使用 `rename` 时,我建议先使用 `-n` 运行它(例如:`rename -n 's/://g' *`),它只会打印出将执行的重命名操作。然后可以再次运行它并删除 `-n` 选项以实际重命名文件。这有助于避免错误,例如意外重命名实际上想要单独留下的一堆文件。 (3认同)