我想用自定义脚本向 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
选择目标路径,因为
mktemp
确保目标文件不存在,并且- 因为它可以与不支持 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.ext
→file-$RANDOM.ext
当项目是目录时,上述选项减少到 2 个:
dir
→$RANDOM
dir
→dir-$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
以下是演示:
参考: