Я хочу добавить запись контекстного меню в наутилус с пользовательским сценарием, но я действительно не знаю, как записать это (я очень неопытен с этим материалом).
В основном я хочу переименовать выбранные файлы с $RANDOM
использование mv -n
при хранении суффикса файла. Кто-либо знает как к этому?
Я знаю, что должен поместить его в ~/.local/share/nautilus/scripts
, это наверняка!
Править: Ничего себе, я (положительно) переполнен Вашими предложениями, все они работают отлично! Спасибо Полевой шпат, David и pa4080!
Вот сценарий, который я сделал:
#!/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
Наутилус предоставляет выделенные контуры к сценариям как аргументы программы. Следующий сценарий переименует пути, предоставленные как аргументы программы случайным файлам (при сохранении расширения файла), и сообщит пользователю о результате через 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
гарантирует, что конечный файл не существует и $RANDOM
, переменная и нет - ударяет расширения. Таким образом случайные имена не являются числовыми, но состоят из последовательности 8 случайных алфавитно-цифровых символов. Если Вы действительно хотите использовать $RANDOM
, я могу создать вариант на основе его.
Вот мое предложение, в котором текущая версия использует первые 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
Вот демонстрация:
Ссылки: