我有一个正在使用的文件列表%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