Je veux ajouter une entrée de menu contextuel à Nautilus avec un script personnalisé, mais je ne sais pas vraiment comment écrire cela (je suis très inexpérimenté avec ce genre de choses).
En gros, je veux renommer les fichiers sélectionnés avec $RANDOM
en utilisant mv -n
tout en conservant le suffixe du fichier. Quelqu'un sait comment faire ça?
Je sais que je dois le placer dans ~/.local/share/nautilus/scripts
, c'est sûr!
Edit: Wow, je suis (positivement) submergé par vos suggestions, elles marchent toutes très bien! Merci Feldspath, David et pa4080!
Voici un script que j'ai fait:
#!/bin/bash
# FileRNG.sh by feldspar15523
# Feel free to edit this as much as you want.
IFS=$'\n'
for i in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
nameInput="$(basename -- "$i")"
extension="${nameInput#*.}"
filePath="$i"
case "$(basename -- "$nameInput")" in
*.* )
mv -nT -- "$filePath" "$PWD/$RANDOM.$extension"
;;
* )
mv -nT -- "$filePath" "$PWD/$RANDOM"
;;
esac
done
Ceci est un script entièrement fonctionnel que vous pouvez utiliser. Il respecte les extensions même s'il n'en a pas. Fonctionne avec plusieurs fichiers. Assurez-vous de permettre son exécution avec chmod +x FileRNG.sh
Nautilus fournit les chemins sélectionnés aux scripts sous forme d'arguments de programme. Le script suivant renommera les chemins fournis en tant qu'arguments du programme en fichiers aléatoires (tout en préservant l'extension du fichier) et informera l'utilisateur du résultat via Zenity (ou sur la ligne de commande sans X):
#!/bin/sh
set -eu
for source; do
case "$source" in
*/*) dir="${source%/*}";;
*) dir=.;;
esac
basename="${source##*/}"
case "$basename" in
?*.*) extension=".${basename##*.}"; basename="${basename%.*}";;
*) extension=;;
esac
message_type=info
destination="$(exec mktemp --tmpdir="$dir" --suffix="$extension" XXXXXXXXXX 2>&1)" ||
{ rv=$?; message="$destination"; false; } &&
message="$(exec mv -vT -- "$source" "$destination" 2>&1)" ||
{ rv="${rv-$?}"; message_type=error; }
if [ -n "${DISPLAY-}" ]; then
zenity "--$message_type" --no-markup --title="${0##*/}" --text="$message"
else
printf '%s: %s: %s\n' "${0##*/}" "$message_type" "$message" >&2
fi
[ -z "${rv-}" ] || exit "$rv"
done
Il utilise mktemp
au lieu de $RANDOM
pour sélectionner le chemin de destination car
mktemp
assure que le fichier cible n'existe pas et$RANDOM
variable et no-clobber de Bash.Ainsi, les noms aléatoires ne sont pas numériques, mais consistent en une séquence de 8 caractères alphanumériques aléatoires. Si vous voulez vraiment utiliser $RANDOM
je peux créer une variante à partir de celle-ci.
Voici ma suggestion, quelle version actuelle utilise les 10 premiers caractères applicables de la réserve infinie de caractères pseudo-aléatoires dans /dev/urandom
. Ce comportement peut être modifié en modifiant les lignes 21 et 22.
La version précédente, qui utilise uniquement $RANDOM
, est disponible dans l'historique .
Le script peut gérer un ou plusieurs fichiers et répertoires sélectionnés.
Lorsque l'élément est un fichier, il y a 3 options:
file.ext
→ $RANDOM
file.ext
→ $RANDOM.ext
file.ext
→ file-$RANDOM.ext
Lorsque l'élément est un répertoire, les options ci-dessus sont réduites à 2:
dir
→ $RANDOM
dir
→ dir-$RANDOM
Le script utilise zenity
pour demander les préférences de l'utilisateur, en fonction des options ci-dessus. De plus, si l'élément est un répertoire, il y a une question supplémentaire, qui a un délai d'attente de 5 secondes.
#!/bin/bash -e
IFS_BAK=$IFS
IFS=$'\t\n'
FILE_LIST=($NAUTILUS_SCRIPT_SELECTED_FILE_PATHS)
IFS=$IFS_BAK
opt1="file.ext → \$RANDOM | dir → \$RANDOM"
opt2="file.ext → \$RANDOM.ext | dir → \$RANDOM"
opt3="file.ext → file-\$RANDOM.ext | dir → dir-\$RANDOM"
OPT=$(zenity --list --width=400 --height=170 \
--text "Random file and directory renamer: ${#FILE_LIST[@]} item(s) are selected." \
--radiolist --column "Pick" \
--column "File opinions | Dir opinions" FANSE "$opt1" TRUE "$opt2" FALSE "$opt3")
if [ "$OPT" == "0" ]; then exit 1; fi
for item in "${FILE_LIST[@]}"; do
URANDOM=$(cat /dev/urandom | tr -dc '0-9a-zA-Z!@$%_+-' | head -c 10)
#URANDOM=$RANDOM
if [ -f "$item" ]; then
DIR="$(dirname "${item}")"
FILE_NAME="$(basename "${item}")"
EXT="${FILE_NAME##*.}"
NAME="${FILE_NAME%.*}"
if [ "$EXT" == "$NAME" ]; then EXT=""; else EXT=".$EXT"; fi
if [ "$OPT" == "$opt1" ]; then mv "$item" "$DIR/$URANDOM"
Elif [ "$OPT" == "$opt2" ]; then mv "$item" "$DIR/$URANDOM$EXT"
Elif [ "$OPT" == "$opt3" ]; then mv "$item" "$DIR/$NAME-$URANDOM$EXT"
else zenity --info --text "Something went wrong!"
fi
Elif [ -d "$item" ]; then
DIR=$(dirname "${item}")
DIR_NAME=$(basename "${item}")
Q=`$(zenity --question --timeout 5 \
--text "The selected item \{ $DIR_NAME \} is a directory. \nHow to proceed\?" \
--cancel-label="Don't rename" --ok-label="Rename") && echo "Rename" || echo "Leave"` #zenity --info --text "$Q"
if [ "$Q" == "Rename" ]; then
if [ "$OPT" == "$opt1" ]; then mv "$item" "$DIR/$URANDOM"
Elif [ "$OPT" == "$opt2" ]; then mv "$item" "$DIR/$URANDOM"
Elif [ "$OPT" == "$opt3" ]; then mv "$item" "$DIR/$DIR_NAME-$URANDOM"
else zenity --info --text "Something went wrong!"
fi
fi
else
zenity --info --text "Something went wrong!"
fi
done
Voici la démo:
Références: