我正在尝试向 nemo 文件管理器添加自定义操作。该操作的目的只是用“_”替换文件名中的所有空格。我的操作文件如下所示:
[Nemo Action]
Name=Normalize
Comment=replace all occurences of " " by "_"
Exec=<normalize.sh %F>
Selection=Any
Extensions=Any
bash 脚本 normalize.sh 位于 actions 目录中,如下所示:
#!/usr/bin/bash
if [[ "$#" != 1 ]]
then exit 1
fi
name=`echo "$1" | sed "s/\ /\_/g"`
mv "$1" "$name"
exit 0
有谁知道,为什么这不起作用?
答案1
问题:
你的问题是如此微不足道,那%F
就是文件名,而文件名包含空格,所以你通过这种方式调用脚本:
normalize.sh my fancy file
就这样$1
变成了my
,$2
变成了fancy
,变成$3
了file
。现在$#
变成3了。
修复1(推荐):
为了解决这个问题。您不需要检查参数的数量。然后你就可以使用$@
来代替$1
.该脚本将如下所示:
#!/usr/bin/bash
name=`echo "$@" | sed "s/\ /\_/g"`
mv "$@" "$name"
exit 0
修复2:
另一个解决方案是在 周围加上引号%F
。正确的代码是这样的:
[Nemo Action]
Name=Normalize
Comment=replace all occurences of " " by "_"
Exec=<normalize.sh "%F">
Selection=Any
Extensions=Any
改进的脚本:
#!/usr/bin/env bash
mv "$@" "$(tr ' ' '_' <<< "$@")"
exit 0
- 正常情况下
bash
是开启的/bin/bash
。由于你的似乎已经打开/usr/bin/bash
(我第一次看到这个),我设置了一个通用的解决方法来运行 bash 无论它在哪里。但是您可以看到which bash
在终端上输入 bash 的路径。 - 删除了计算参数的条件。
- 为什么要使用
sed
现有的tr
? - 而不是
echo
使用文件sed
或tr
,更好地使用<<<
. - 为什么不把所有内容都放在一行中呢?