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

Dan*_*s W 4 sed shell-script filenames

我有一个使用%20表示名称中的空格的文件列表。

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

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

这玩意不好。它吐出这个:

usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory
Run Code Online (Sandbox Code Playgroud)

但是当我导入它们时,我对我的一些图像做同样的事情并且它工作正常:

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

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

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

αғs*_*нιη 9

在所有类型的文件中使用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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 值得一提的是,这只适用于安装了 Perl `rename` 实用程序的系统,即 Ubuntu。它可能适用于所有系统,也可能不适用于所有系统。IIRC,Mac OS X 默认不附带 Perl 重命名实用程序,这意味着它必须与 Homebrew 或类似工具一起安装。 (4认同)

Ant*_*hon 7

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

mv abc%20def abc def
Run Code Online (Sandbox Code Playgroud)

wheremv有太多的论点。这些是给你usage:信息的人。

你应该做的是:

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


PM *_*ing 6

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

mv -- "$x" "${x//%20/ }"
Run Code Online (Sandbox Code Playgroud)

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

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

附注。感谢 Chazelas 先生提供--我命令行中的缺失。--表示参数列表中选项的结尾;没有它,开头的文件名可能-会被解释为选项。