将文件名中的 %20 替换为空格?

将文件名中的 %20 替换为空格?

我有一个正在使用的文件列表%20来表示他们的名字中的空格。

我目前正在尝试执行以下操作,将它们全部从 %20 更改为空格“”。

for x in *.txt
  do mv $x $(echo $x | sed -e 's/%20/ /')
done

这可不太好玩。它吐出这样的内容:

usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

但是当我导入一些图像时,我对它们做了同样的事情,并且效果很好:

for x in *_MG*.CR2
  do mv $x $(echo $x | sed -e 's/_MG/_IMG/')
done

忘记有人正在使用。TXT另一个是.CR2,我在这里完全忽略了什么?

请记住,我使用的是工作笔记本电脑,因此我无法添加 Homebrew 来安装任何其他软件。操作系统是 Mac OS X。

答案1

在所有类型的文件中使用rename并替换为空格:%20

$ rename -n 's/%20/ /g' *

File%20with%20in00.yA2 renamed as File with in00.yA2
File%20with%20in01.h9H renamed as File with in01.h9H
File%20with%20in02.CNR renamed as File with in02.CNR
File%20with%20in03.PuP renamed as File with in03.PuP
File%20with%20in04.js8 renamed as File with in04.js8
File%20with%20in05.KdZ renamed as File with in05.KdZ

在 OS X 中,您可以使用专门的工具,例如基于 Perl 的重命名实用程序。您可以使用流行的包管理器安装它自制:brew install rename

注意:删除-n执行实际重命名的选项。

答案2

不需要使用 sed,这可以通过参数扩展来处理

mv -- "$x" "${x//%20/ }"

FWIW,我会%20用下划线(或其他东西)替换那些 s ;我包含空格的文件名。但我想学习如何编写可以处理文件名中的空格和其他特殊字符的 bash 脚本是一件好事。 :)

正如 Izkata 在评论中提到的那样,非常重要的是引用参数! bash(及相关 shell)中的双引号不仅仅是字符串分隔符,它们还表示您不希望发生分词。因此,如果x包含一个带有空格的文件名,$x将被视为两个参数,但"$x"将被视为单个参数。如果我们使用单引号,我们会禁止参数扩展,因此'$x'只会产生包含 的文字字符串$x,这通常不是我们想要的。 :)

附言。感谢查泽拉斯先生--在我的命令行中提供了缺失的内容。--指示参数列表中选项的结尾;如果没有它,以 开头的文件名可能会-被解释为选项。

答案3

由于可能的输出mv有空格,因此您需要在结果两边加上双引号,以免尝试在循环中执行命令,for例如:

mv abc%20def abc def

哪里mv有太多的争论。这些是给你信息的人usage:

你应该做的是:

for x in *_MG*.CR2
do 
  mv -- "$x" "$(printf '%s\n' "$x" | sed 's/_MG/_IMG/')"
done

相关内容