You can't have two files by the same name at the same time, so you'll need to first create the directory under a temporary name, then move the file into it, then rename the directory. Or alternatively rename the file to a temporary name, create the directory, and finally move the file.
I see that Nautilus scripts can be written in any language. You can do this with the most pervasive scripting language, /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
Explanations:
set -e
aborts the script on error.
- The
for
loop iterates over the arguments of the script.
- The
case
block sets TMPDIR
to the directory containing the file. It works whether the argument contains a base name or a file path with a directory part.
mktemp -d
creates a directory with a random name in $TMPDIR
.
- First I move the file to the temporary directory, then I rename the directory. This way, if the operation is interrupted in the middle, the file still has its desired name (whereas in the rename-file-to-temp approach there's a point in time when the file has the wrong name).
If you want to remove the file's extension from the directory, change the last mv
call to
mv -- "$temp" "$TMPDIR/${file%.*}"
${file%.*}
takes the value of file
and removes the suffix that matches .*
. If the file has no extension, the name is left unchanged.