web-dev-qa-db-fra.com

Script Nautilus (menu contextuel) pour renommer rapidement un fichier avec $ RANDOM - mais comment?

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!

2
Regis

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

4
Feldspar15523

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

  1. mktemp assure que le fichier cible n'existe pas et
  2. car il fonctionne avec des shells Bourne compatibles POSIX qui ne prennent pas en charge les extensions spéciales $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.

3
David Foerster

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.extfile-$RANDOM.ext
  • Lorsque l'élément est un répertoire, les options ci-dessus sont réduites à 2:

    • dir$RANDOM
    • dirdir-$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:

enter image description here

Références:

1
pa4080