O problema:
Seu problema é tão trivial, que %F é o nome do arquivo, e o nome do arquivo contém espaços, então você está chamando o script desta forma:
normalize.sh my fancy file
Portanto, $1 se torna my , $2 se torna fancy e $3 se torna file . Agora $# se torna 3.
Correção 1 (recomendado):
Para consertar isso. você não precisa verificar o número de argumentos. Então você pode usar $@ em vez de $1 . O script ficará assim:
#!/usr/bin/bash
name='echo "$@" | sed "s/\ /\_/g"'
mv "$@" "$name"
exit 0
Correção 2:
Outra solução é colocar aspas em torno de %F . O código correto seria este:
[Nemo Action]
Name=Normalize
Comment=replace all occurences of " " by "_"
Exec=<normalize.sh "%F">
Selection=Any
Extensions=Any
Script melhorado:
#!/usr/bin/env bash
mv "$@" "$(tr ' ' '_' <<< '$@')"
exit 0
- Normalmente,
bashestá em/bin/bash. Como o seu parece estar em/usr/bin/bash(a primeira vez que vejo isso) eu coloquei uma soluçãouniversalpara executar o bash onde quer que esteja. No entanto, você pode ver o caminho para basear a digitação dewhich bashem um terminal. - Removido condicional para contar argumentos.
- Por que usar
sedpara essetr? - Em vez de
echodo arquivo parasedoutr, use melhor<<<. - Por que não colocar tudo em uma linha?