Numeração seqüencial automática de (salvar) nomes de arquivos em diálogos de GUI?

1

Estou no Ubuntu 14.04 e, muitas vezes, eu uso a tecla PrtScn (Print Screen) para obter uma captura de tela; então eu recebo um diálogo como:

Aqui,porpadrão,vocêobtémumnomedearquivoScreenshot.pngcomopadrão;noentanto,seumarquivocomessenomejáexistir,entãognome-screenshotfaráanumeraçãoseqüencialautomáticadonomedoarquivoesugeriráScreenshot-1.png.

Agora,digamosqueeunãoqueiraScreenshotcomoabasedonomedoarquivo,masalgocomomypic.Existeumamaneiradeinseriressenomedearquivoemalgumformato-digamos,mypic%03d.png-detalformaque,apóssalvar,osistemaverificaráqualéomaiornúmerodearquivosmypic*existentes(digamosmypic010.png)eautoincrementessenúmeroparaobteronomedearquivo"expandido" do arquivo a ser salvo (que neste exemplo seria mypic011.png )?

Note que aqui, apenas menciono gnome-screenshot como exemplo; Eu estaria interessado em usar algo assim de todos e quaisquer diálogos de salvar arquivos GUI: por exemplo, se eu tenho um arquivo de texto no Geany, e em "Salvar como" eu digito /tmp/mytext%03d.txt , então o sistema verificaria o final número existente do arquivo mytext*.txt existente no diretório /tmp , incremento automático em um, e salve o arquivo com esse número no diretório /tmp .

Existe algum padrão que faz isso? Se não, existem alternativas alternativas? Se eu estivesse na linha de comando do shell, poderia fazer um script para calcular sufixos numéricos de incremento automático - e, em seguida, usar algo como $(get-next-num.sh /tmp/mytext%03d.txt) em vez do nome do arquivo; mas como aqui o problema está nas caixas de diálogo da GUI, duvido que qualquer diálogo da GUI interprete $(get-next-num.sh /tmp/mytext%03d.txt) como uma diretiva para executar isso como bash code em uma subshell ...

    
por sdaau 18.01.2018 / 16:07

1 resposta

0

Uma solução é configurar um processo de segundo plano genérico que ouve novos arquivos com nomes bem definidos e renomeia-os automaticamente. Você pode usar inotifywait para assistir com eficiência a um diretório como ~/Desktop para novos arquivos sendo criados (especificamente, fechados após abrir para gravação) e renomeie esse arquivo se for Screenshot.png para o próximo arquivo mytext999.txt livre. Aqui está um exemplo. A maior parte do código é a função template para encontrar o próximo nome de arquivo livre, que não é o objeto da questão.

#!/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
    
por 18.01.2018 / 20:55