增加 shell 脚本中命令输出的文件标题

Increment the title of files output by a command in a shell script

我制作了这个简单的 bash 脚本来截取 full-screen 屏幕截图并将其保存到图片文件夹

#!/usr/bin/bash

xfce4-screenshooter -f -s /home/rgcodes/Pictures/Screenshot_$scrshotcount.png 
let "scrshotcount++"

...遇到问题了。 scrshotcount 是我在 /etc/environment 中定义的全局变量,每次脚本运行时都会递增。但是,脚本无法全局递增变量,并导致脚本只是覆盖之前的屏幕截图。在 Google 和 Stack Overflow 上搜索发现问题根本不简单(关于 child shell 无法更改 parents 的变量),找到其他方法会更好.

这是我的问题。我们如何将数字(按升序)附加到脚本抛出的屏幕截图,以便它们像在 Windows 上拍摄的一样保存?(Windows auto-suffixes 匹配文件名,而不是覆盖它们,因此所有屏幕截图都具有相同的名称 'Screenshot' 和使用屏幕截图命令的次数。)

我暂时使用@erikMD 的方法作为临时 stop-gap。

除了关于使用日期而不是计数器的极好的建议之外,还有一种使用计数器的方法:/

dir=$HOME/Pictures

# find the current maximum value
current_max=$( 
    find "$dir" -name Screenshot_\*.png -print0 \
    | sort -z -V \
    | tail -z -n 1
)
if [[ ! $current_max =~ _([0-9]+)\.png ]]; then
    echo "can't find the screenshot with the maximum counter value" >&2
    exit 1
fi

# increment it
counter=$(( 1 + ${BASH_REMATCH[1]} ))

# and use it
xfce4-screenshooter -f -s "$dir/Screenshot_${counter}.png"

您必须手动创建 Screenshot_1.png 文件。

确实,正如评论中@j_b 所建议的,您一定要尝试在命令 date +"$format".

中使用时间戳

FTR,同样的思路实现了here in this project of a gnome-screenshot bash wrapper
(免责声明:我是这个 repo 的作者)。

示例命令:

date "+%Y-%m-%d_%H-%M-%S"

↓

2021-07-29_19-13-30

所以整个脚本可以是这样的:

#!/usr/bin/env bash

xfce4-screenshooter -f -s "$HOME/Pictures/Screenshot_$(date "+%Y-%m-%d_%H-%M-%S").png"

(请注意,我添加了缺少的双引号,并修改了您的 shebang,因为 /usr/bin/env bash/bin/bash/usr/bin/bash 更便携。)

下面的@rgcodes 是一个脚本,它将根据您的原始 post 捕获带有数字计数指示器的屏幕截图。 (在 Ubuntu 20.04 上测试过)

脚本内容:

#!/bin/bash

set -uo pipefail

# add source file and line number to xtrace output 
# i.e. when running:  bash -x ./your_script_name.sh
export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'

capture_screenshot() {
    local output_dir="${1:-/tmp/screenshot}"
    local img_name="${2:-Screenshot}"
    local img_ext="${3:-png}"
    
    # create output directory (if not already existing)
    mkdir -p "${output_dir}"

    # get the last image in the sorted ls output
    local latest_png=$(tail -n 1 \
        <(sort -n -t _ -k 2 \
        <(ls ${output_dir}/*.${img_ext} 2> /dev/null)))

    # use the latest image to determine img_cnt value for next image
    local img_cnt=0
    if [[ ${latest_png} =~ _([0-9]+)\.png ]]; then
        img_cnt=$((1+${BASH_REMATCH[1]}))
    elif [[ ${latest_png} =~ ${img_name}.${img_ext} ]] ; then
        img_cnt=1
    fi

    # build path to output image
    local img_path="${output_dir}/${img_name}_${img_cnt}.${img_ext}"
    
    # remove count from output image path if count == 0
    if [[ "${img_cnt}" -eq "0" ]] ; then
        img_path="${output_dir}/${img_name}.${img_ext}"
    fi        

    xfce4-screenshooter -f -s "${img_path}"
}

capture_screenshot "$@"

默认使用以下内容,但您可以更改它们以满足您的要求。

截图输出目录:
/tmp/screenshot

基本截图图像名称:
Screenshot

截图文件扩展名:
.png

如果输出目录不存在,脚本将尝试创建输出目录(需用户允许创建)。以下是示例用法。

在初始脚本执行之前,输出目录不存在:

$ ls screenshot
$

初始执行(创建目录并Screenshot.png创建:

$ ./script.sh 
$ ls /tmp/screenshot/
Screenshot.png

后续执行:

$ ./script.sh 
$ ls /tmp/screenshot/
Screenshot_1.png  Screenshot.png
$ ./script.sh 
$ ls /tmp/screenshot/
Screenshot_1.png  Screenshot_2.png  Screenshot.png