Nautilus(上下文菜单)脚本使用 $RANDOM 快速重命名文件 - 但是如何使用呢?

Nautilus(上下文菜单)脚本使用 $RANDOM 快速重命名文件 - 但是如何使用呢?

我想用自定义脚本向 nautilus 添加上下文菜单项,但我真的不知道如何编写它(我对这些东西非常不熟悉)。

基本上我想$RANDOM使用重命名选定文件mv -n,同时保留文件后缀。有人知道怎么做吗?

我知道我必须把它放进去~/.local/share/nautilus/scripts,这是肯定的!

编辑:哇,我(确实)被你的建议感动了,它们全都很棒!谢谢 Feldspar、David 和 pa4080!

答案1

这是我编写的脚本:

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

这是一个功能齐全的脚本,您可以使用。即使没有扩展名,它也能识别。适用于多个文件。请确保允许它使用chmod +x FileRNG.sh

答案2

Nautilus 将选定的路径作为程序参数提供给脚本。以下脚本将作为程序参数提供的路径重命名为随机文件(同时保留文件扩展名),并通过 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. 因为它可以与不支持 Bash 的特殊$RANDOM变量和 no-clobber 扩展的 POSIX 兼容的 Bourne shell 一起使用。

因此,随机名称不是数字,而是由 8 个随机字母数字字符序列组成。如果您确实想使用,$RANDOM我可以基于它创建一个变体。

答案3

这是我的建议,当前版本使用 中无穷无尽的伪随机字符中的前 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

以下是演示:

在此处输入图片描述

参考:

相关内容