私はUbuntu 14.04を使用していますが、PrtScn(Print Screen)キーを使ってスクリーンショットを撮ると、次のダイアログボックスが表示されます。
ここではデフォルトでデフォルトのファイル名が指定されます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
システムは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
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