从所有文件名中删除撇号

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 模式本身将被传递给。


Gil*_*il' 6

始终在变量替换$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 等衍生产品下,可以使用renamePerl 脚本。

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