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 -e
anula o script em erro. - O loop
for
itera sobre os argumentos do script. - O bloco
case
defineTMPDIR
como 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 -d
cria 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.