自定义 nemo 操作/bash 脚本

自定义 nemo 操作/bash 脚本

我正在尝试向 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,变成$3file。现在$#变成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使用文件sedtr,更好地使用<<<.
  • 为什么不把所有内容都放在一行中呢?

相关内容