Наутилус (контекстное меню) сценарий для быстрого переименования файла с помощью $RANDOM - но как?

Я хочу добавить запись контекстного меню в наутилус с пользовательским сценарием, но я действительно не знаю, как записать это (я очень неопытен с этим материалом).

В основном я хочу переименовать выбранные файлы с $RANDOM использование mv -n при хранении суффикса файла. Кто-либо знает как к этому?

Я знаю, что должен поместить его в ~/.local/share/nautilus/scripts, это наверняка!

Править: Ничего себе, я (положительно) переполнен Вашими предложениями, все они работают отлично! Спасибо Полевой шпат, David и pa4080!

2
задан 21 November 2017 в 22:35

3 ответа

Вот сценарий, который я сделал:

#!/bin/bash

# FileRNG.sh by feldspar15523
# Feel free to edit this as much as you want.

IFS= 

Это - полностью функциональный сценарий, который можно использовать. Это уважает расширения, даже если это не имеет того. Работы с несколькими файлами. Обязательно позвольте этому выполняться с chmod +x FileRNG.sh

\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

Это - полностью функциональный сценарий, который можно использовать. Это уважает расширения, даже если это не имеет того. Работы с несколькими файлами. Обязательно позвольте этому выполняться с chmod +x FileRNG.sh

4
ответ дан 2 December 2019 в 01:32

Наутилус предоставляет выделенные контуры к сценариям как аргументы программы. Следующий сценарий переименует пути, предоставленные как аргументы программы случайным файлам (при сохранении расширения файла), и сообщит пользователю о результате через Zenity (или на командной строке без 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

Это использует mktemp вместо $RANDOM для выбора целевого пути, потому что

  1. mktemp гарантирует, что конечный файл не существует и
  2. , потому что это работает с совместимыми POSIX Оболочками Bourne, которые не поддерживают специальное предложение Bash’s $RANDOM, переменная и нет - ударяет расширения.

Таким образом случайные имена не являются числовыми, но состоят из последовательности 8 случайных алфавитно-цифровых символов. Если Вы действительно хотите использовать $RANDOM, я могу создать вариант на основе его.

3
ответ дан 2 December 2019 в 01:32

Вот мое предложение, в котором текущая версия использует первые 10 применимых символов от бесконечного предоставления псевдослучайных символов /dev/urandom. Это поведение могло быть изменено путем редактирования строки 21 и 22.

  • Предыдущая версия, которая использует только $RANDOM, доступно в рамках истории.

  • Сценарий может обработать единственный и несколько выбранных файлов и каталогов.

  • Когда объект является файлом существует 3 опции:

    • file.ext$RANDOM
    • file.ext$RANDOM.ext
    • file.extfile-$RANDOM.ext
  • Когда объект является каталогом, вышеупомянутые опции уменьшаются до 2:

    • dir$RANDOM
    • dirdir-$RANDOM
  • Использование сценария zenity попросить предпочтения пользователя, согласно вышеупомянутым опциям. Также, если объект является каталогом существует дополнительный вопрос, который имеет 5 секунд, испытывают таймаут.

#!/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

Вот демонстрация:

enter image description here

Ссылки:

1
ответ дан 2 December 2019 в 01:32

Другие вопросы по тегам:

Похожие вопросы: