xra*_*alf 8 command-line shell rename
我试图从目录中的所有文件名中删除撇号。
for i in *; do mv $i `echo $i | tr -d "'"`; done
Run Code Online (Sandbox Code Playgroud)
执行此命令后,不会重命名任何内容。
你知道这里有什么问题吗?
Mat*_*Mat 10
你可以试试这样的(bash
):
shopt -s nullglob
for i in *\'* ; do mv -v "$i" "${i/\'/}" ; done
Run Code Online (Sandbox Code Playgroud)
这使用 shell 字符串替换。您可能不想 glob 文件中没有的文件,'
因为它们mv
会失败。如果没有这个nullglob
选项,mv
如果没有匹配的文件,glob 模式本身将被传递给。
始终在变量替换$foo
和命令替换周围放置双引号$(foo)
(除非您知道为什么需要将它们排除在外以及为什么可以这样做)。
for i in *; do mv "$i" "$(echo "$i" | tr -d "'")"; done
Run Code Online (Sandbox Code Playgroud)
这通常会起作用,但有一些限制:
-
,mv
则会出现不良行为或错误,因为会将其解释为一个选项。.
.echo
命令中的反斜杠。在 ksh93、bash 和 zsh 中,您可以使用${VARIABLE//PATTERN/REPLACEMENT}
构造更轻松地编写它。添加--
到mv
处理以-
. 如果您的文件名以 开头.
,请根据需要添加.*
或.[^.]* ..?*
之后*
。
for i in *; do mv -- "$i" "${i//\'/}"; done
Run Code Online (Sandbox Code Playgroud)
在 zsh 中,您可以使用zmv
:
zmv '(*)' "\${1//\\'/}"
Run Code Online (Sandbox Code Playgroud)
在 Debian、Ubuntu 等衍生产品下,可以使用rename
Perl 脚本。
rename "s/'//g" *
Run Code Online (Sandbox Code Playgroud)