GUI 对话框中文件名的自动顺序编号(保存)?

GUI 对话框中文件名的自动顺序编号(保存)?

我使用的是 Ubuntu 14.04,经常使用 PrtScn(打印屏幕)键来获取屏幕截图;然后我得到一个像这样的对话框:

gnome 屏幕截图

在这里,默认情况下你会得到一个Screenshot.png默认的文件名;但是,如果该名称的文件已存在,则将gnome-screenshot对文件名进行自动顺序编号,并建议Screenshot-1.png.

现在,假设我不想Screenshot作为文件名的基础,而是像mypic.有没有一种方法可以让我以某种格式输入此文件名 - 例如,mypic%03d.png- 这样,在保存时,系统将检查现有mypic*文件的最大数量(例如mypic010.png),然后自动递增该数字以获得“扩展”要保存的文件的文件名(在本例中为mypic011.png)?

请注意,这里我只是举gnome-screenshot个例子;我有兴趣在所有 GUI 文件保存对话框中使用类似的内容:例如,如果我在 Geany 中有一个文本文件,并且在我输入“另存为”时/tmp/mytext%03d.txt,系统将检查最终现有的数量目录mytext*.txt中现有文件/tmp,自动递增一,并将具有该编号的文件保存在/tmp目录中。

有没有任何标准可以做到这一点?如果没有,是否有替代解决方法?如果我在 shell 命令行中,我只需编写一个脚本来计算自动增量数字后缀 - 然后使用类似的内容$(get-next-num.sh /tmp/mytext%03d.txt)代替文件名;但由于这里的问题在于 GUI 对话框,我怀疑任何和所有 GUI 对话框都会将其解释为在子 shell 中将$(get-next-num.sh /tmp/mytext%03d.txt)其作为代码运行的指令...bash

答案1

一种解决方法是设置一个通用后台进程,用于侦听具有明确定义名称的新文件,并自动重命名它们。您可以使用inotifywait它来有效地监视目录,例如~/Desktop正在创建的新文件(特别是在打开写入后关闭),然后重命名该文件(如果它是Screenshot.png下一个空闲mytext999.txt文件)。这是一个例子。大部分代码是template查找下一个空闲文件名的函数,这不是问题的对象。

#!/bin/bash
# https://unix.stackexchange.com/a/418088/119298
# auto rename files when they are written to in watched directory
template(){
        local file=$1 max=$2 suffix=$3 pat last next
        pat="$file${max//9/[0-9]}$suffix"
        for last in $pat; do : ; done
        if [ "$last" = "$pat" ]
        then    next=${max//9/0}  # no files, start from 0
        else    last="${last:${#file}:${#max}}"
                [ "$last" = "$max" ] && return 1
                printf -v next "%0${#max}d" $((10#$last+1))
        fi
        newfile="$file$next$suffix"
        [ ! -e "$newfile" ]
}

cd ~/Desktop/
inotifywait -m -e close_write ~/Desktop/ |
while read dir event file
do      case $file in
        Screenshot.png) template mypic 999 .png || exit
                        mv "$file" "$newfile" ;;
        esac
done

相关内容