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。
在所有类型的文件中使用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
选项以执行实际重命名。
由于输出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)
不需要使用sed,这可以通过参数扩展来处理
mv -- "$x" "${x//%20/ }"
Run Code Online (Sandbox Code Playgroud)
FWIW,我会用%20
下划线(或其他东西)替换那些s ;我讨厌包含空格的文件名。但是我想学习如何编写可以处理文件名中的空格和其他特殊字符的 bash 脚本是一件好事。:)
正如 Izkata 在评论中提到的,引用参数非常重要!bash(和相关shell)中的双引号不仅仅是字符串分隔符,它们还表示您不希望发生分词。因此,如果x
包含一个带有空格的文件名,$x
它将被视为两个参数,但"$x"
将被视为单个参数。如果我们使用单引号,我们会禁止参数扩展,因此'$x'
只会导致包含 的文字字符串$x
,这通常不是我们想要的。:)
附注。感谢 Chazelas 先生提供--
我命令行中的缺失。--
表示参数列表中选项的结尾;没有它,开头的文件名可能-
会被解释为选项。