Você não pode ter dois arquivos com o mesmo nome ao mesmo tempo, então você precisa primeiro criar o diretório com um nome temporário, depois mover o arquivo para ele e renomear o diretório. Ou, alternativamente, renomeie o arquivo para um nome temporário, crie o diretório e, finalmente, mova o arquivo.
Vejo que scripts do Nautilus podem ser escritos em qualquer idioma. Você pode fazer isso com a linguagem de script mais difundida, /bin/sh .
#!/bin/sh
set -e
for file do
case "$file" in
*/*) TMPDIR="${file%/*}"; file="${file##*/}";;
*) TMPDIR=".";;
esac
temp="$(mktemp -d)"
mv -- "$file" "$temp"
mv -- "$temp" "$TMPDIR/$file"
done
Explicações:
-
set -eanula o script em erro. - O loop
foritera sobre os argumentos do script. - O bloco
casedefineTMPDIRcomo o diretório que contém o arquivo. Funciona se o argumento contiver um nome base ou um caminho de arquivo com uma parte do diretório. -
mktemp -dcria um diretório com um nome aleatório em$TMPDIR. - Primeiro, movo o arquivo para o diretório temporário e renomeio o diretório. Dessa forma, se a operação for interrompida no meio, o arquivo ainda terá seu nome desejado (enquanto na abordagem renomear arquivo para temp, há um momento em que o arquivo tem o nome incorreto).
Se você quiser remover a extensão do arquivo do diretório, altere a última mv chamada para
mv -- "$temp" "$TMPDIR/${file%.*}"
${file%.*} recebe o valor de file e remove o sufixo que corresponde a .* . Se o arquivo não tiver extensão, o nome não será alterado.