10 command-line bash sed batch-rename
我正在尝试重命名这样的文件:
for file in *;
do
mv -i "$file" "$(echo "$file" | sed -e 's/[^A-Za-z0-9._-]/_/g')";
done
Run Code Online (Sandbox Code Playgroud)
但是该sed
命令将所有空格替换为_
.
如何编辑sed
命令以使其包含空格和指定的字符?我试过使用\s
但它不起作用...
编辑:
例如:文件trip: hill
,应该重命名:trip_ hill
,但上面的命令使它trip__hill
。
Zan*_*nna 11
不要解析文件名sed
!的输出echo "$file"
可能不可靠。
使用rename
. 在 17.10 上,您需要先安装它
sudo apt install rename
Run Code Online (Sandbox Code Playgroud)
然后:
rename -n -- 's/[^-A-Za-z0-9_ .]/_/g' *
Run Code Online (Sandbox Code Playgroud)
-n
测试后删除以实际重命名文件--
选项结束,以防任何文件以 -
[^-A-Za-z0-9_ .]
我们不想替换的字符 - 放在-
第一个或最后一个,所以它不能表示一个范围(它在这些位置按字面处理)。.
按字面处理(在其他正则表达式上下文中,它代表任何字符,需要进行转义)。这也适用于sed
:
$ echo 'trip: hill' | sed 's/[^-A-Za-z0-9 _.]/_/g'
trip_ hill
Run Code Online (Sandbox Code Playgroud)
如果我在您的版本的末尾添加一个空格,则会出现错误:
$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._- ]/_/g'
sed: -e expression #1, char 22: Invalid range end
Run Code Online (Sandbox Code Playgroud)
但-
最后,它起作用了:
$ echo 'trip: hill' | sed -e 's/[^A-Za-z0-9._ -]/_/g'
trip_ hill
Run Code Online (Sandbox Code Playgroud)
因此,当您添加空格时,连字符的位置可能会导致您的问题。但建议不要解析文件名!