目前,我正在使用的程序自动创建的目录包含冒号 ( :
),当我尝试操作目录时会产生问题。有人能帮我先删除这个冒号,然后进入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
如果只有一个目录,您可以使用mv
和cd
。要利用bash
历史扩展以及特殊参数$_
:
mv Lang-32b-Branch:Line !#:$:s/:/ && cd $_
!#:$:s/:/
$
被替换为当前命令行 ( ) 的最后一个单词 ( ) !#
,其中第一个单词:
被s
替换为空。如果您希望每一个要删除冒号,请将其更改为(全局)。只需用最后一个命令的最后一个参数替换即可。!#:$:gs/:/
g
$_