我想复制一个名称包含时间戳的文件,例如 -
image-abc-20201113-1703.bin
在该地点/my/path/for/the/image
。
我想将此图像复制到设备 -mydevice
保存在~/.ssh/config
由于文件名不是恒定的,我无法在脚本中对其进行硬编码。
所以我使用正则表达式来复制该文件,例如 -
scp /my/path/for/the/image/image-abc-*.bin mydevice:flash:<file_name>
所以我需要提及正在复制的源文件的名称file_name
我怎样才能实现这个目标?
答案1
如果您觉得必须提供正确的目标文件名,我认为您不应该这样做需要来做,然后使用你的文件名通配模式(这不是正则表达式)循环中:
for pathname in /my/path/for/the/image/image-abc-*.bin
do
[ -e "$pathname" ] &&
scp "$pathname" "mydevice:flash:$(basename "$pathname")"
done
这将复制名称与给定的通配模式匹配的所有文件。该-e
测试确保$pathname
调用之前的路径名实际存在scp
(如果没有找到匹配的名称,该模式将保持未展开状态)。
此处使用该basename
实用程序提取路径名的文件名部分。然后将其用作目标文件名。还可以使用参数替换"${pathname##*/}"
来代替命令替换调用basename
。
如果您确定您的模式仅匹配单个文件,您也可以这样做
set -- /my/path/for/the/image/image-abc-*.bin
[ -e "$1" ] && scp "$1" "mydevice:flash:$(basename "$1")"
这本质上与仅运行上述循环的第一次迭代相同,使用位置参数来保存与模式匹配的路径名的扩展列表。