我使用的是 Ubuntu 14.04,经常使用 PrtScn(打印屏幕)键来获取屏幕截图;然后我得到一个像这样的对话框:
在这里,默认情况下你会得到一个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