Bis*_*uit 7 command-line batch-rename
目前,为我正在使用的程序自动创建的目录包括冒号 ( :),当我尝试操作目录时会产生问题。谁能帮我先删除这个冒号,然后才能cd进入重命名的目录?(所以我想我必须将新目录名等于一个变量?)
例子:
Lang-32b-Branch:LineLang-32b-BranchLineArr*_*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)
如果您想要一个通用命令来重命名带有一个或多个冒号的多个文件和/或目录,您可以使用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 选项的情况下再次运行它以实际重命名文件。这有助于避免错误,例如意外重命名实际上想要单独留下的一堆文件。