GUI 대화 상자에서 파일 이름의 자동 순차 번호 지정(저장)?

GUI 대화 상자에서 파일 이름의 자동 순차 번호 지정(저장)?

저는 Ubuntu 14.04를 사용하고 있으며 종종 PrtScn(Print Screen) 키를 사용하여 스크린샷을 찍으면 다음과 같은 대화 상자가 나타납니다.

그놈 스크린샷

여기에서는 기본적으로 기본 파일 이름이 지정됩니다 Screenshot.png. 그러나 해당 이름의 파일이 이미 존재하는 경우 gnome-screenshot파일 이름은 자동으로 순차적으로 번호가 매겨져 제안됩니다 Screenshot-1.png.

Screenshot이제 파일 이름을 기준으로 삼고 싶지 않지만 mypic. 기존 파일(예: )을 "확장"하여 저장 중인 파일의 파일 이름을 얻기 위해 해당 숫자를 자동으로 증가시키나요(이 경우 )?mypic%03d.pngmypic*mypic010.pngmypic011.png

여기서는 단지 예를 제시한 것뿐입니다 gnome-screenshot. 모든 GUI 파일 저장 대화 상자에 비슷한 내용이 있으면 좋겠습니다. 예를 들어 Geany에 텍스트 파일이 있고 "다른 이름으로 저장"을 입력하면 /tmp/mytext%03d.txt시스템이 will 디렉토리 mytext*.txt에 있는 기존 파일 의 최종 개수를 확인하고 /tmp자동으로 1씩 증가한 후 해당 번호로 파일을 /tmp디렉토리에 저장합니다.

이를 수행하는 표준이 있습니까? 그렇지 않은 경우 대체 해결 방법이 있습니까? 쉘 명령줄에 있다면 자동 증가 숫자 접미사를 계산하는 스크립트를 작성한 다음 $(get-next-num.sh /tmp/mytext%03d.txt)파일 이름을 이와 유사한 것으로 바꿀 수 있지만 여기서 문제는 GUI 대화 상자에 있기 때문에 모든 GUI가 의심됩니다. 대화 상자는 이를 $(get-next-num.sh /tmp/mytext%03d.txt)서브셸에서 코드로 실행하라는 명령 으로 해석합니다 .bash

답변1

한 가지 해결 방법은 잘 정의된 이름을 가진 새 파일을 수신하고 자동으로 이름을 바꾸는 일반 백그라운드 프로세스를 설정하는 것입니다. 이를 사용하여 생성되는 새 파일(특히 쓰기 위해 열었다가 닫는 경우) inotifywait과 같은 디렉터리를 효과적으로 모니터링한 다음 파일이 다음 무료 파일인 경우 파일 이름을 바꿀 수 있습니다. 여기에 예가 있습니다. 대부분의 코드는 질문의 대상이 아닌 다음 무료 파일 이름을 찾는 함수입니다.~/DesktopScreenshot.pngmytext999.txttemplate

#!/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

관련 정보