增加 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
我制作了这个简单的 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