![帮助将 bash 脚本从 Linux 转换为 FreeBSD 10.3-RELEASE-p19](https://linux22.com/image/202275/%E5%B8%AE%E5%8A%A9%E5%B0%86%20bash%20%E8%84%9A%E6%9C%AC%E4%BB%8E%20Linux%20%E8%BD%AC%E6%8D%A2%E4%B8%BA%20FreeBSD%2010.3-RELEASE-p19.png)
我将相机中的 jpeg 文件以这种格式保存在 FTP 服务器上:
/cctv/IPC06/2022-02-11/001/jpg/12/26/01[M][0@0][0].jpg
/cctv/IPC06/2022-02-11/001/jpg/12/24/20[M][0@0][0].jpg
/cctv/IPC06/2022-02-11/001/jpg/12/24/42[M][0@0][0].jpg
/cctv/IPC06/2022-02-11/001/jpg/14/15/32[M][0@0][0].jpg
/cctv/IPC06/2022-02-11/001/jpg/14/15/52[M][0@0][0].jpg
我有一个在 Linux 上运行的脚本,用于重命名和移动 jpg 位置中的文件,如下所示:(
它只是从路径 - 从结束固定位置剪切了两个“/”):
/cctv/IPC06/2022-02-11/001/jpg/122601[M][0@0][0].jpg
/cctv/IPC06/2022-02-11/001/jpg/122420[M][0@0][0].jpg
/cctv/IPC06/2022-02-11/001/jpg/122442[M][0@0][0].jpg
/cctv/IPC06/2022-02-11/001/jpg/141532[M][0@0][0].jpg
/cctv/IPC06/2022-02-11/001/jpg/141552[M][0@0][0].jpg
我在从 jpg 位置连接到 FTP 的终端上运行它,它工作正常,但需要很长时间,因为我从远程位置执行此操作:
find . -mindepth 2 -type f -iname '*.jpg' -exec bash -c 'path1="${0:0:-23}" name1="${0: -23:2}" name2="${0: -20:2}" name3="${0: -17}"; echo mv "$0" "${path1}${name1}${name2}${name3}"' {} \;
我想在 FTP 服务器上安装这个脚本FreeBSD 10.3-发布-p19但是因为没有安装BASH,无法安装它失败了:${1:0...}:错误替换
任何人都可以帮助转换这个 linux 脚本以在安装的 BSD 服务器上运行吗?
我检查了一下,BSD 上安装了 awk 和 cut ...。
谢谢。
#!/bin/sh
# BSD scripts for camera.
# OK this delete old recordings in BSD
#find /cctv/IPC06/* -maxdepth 0 -type d -mtime +32 | xargs rm -rf
# find jpg rename and move it... from linux...not working in BSD yet.
# ERROR
# ${1:0...}: Bad substitution
# ${1:0...}: Bad substitution
find /cctv/IPC06/* -type f -iname '*.jpg' -exec /bin/sh -c 'path1="${1: 0:-23}"; name1="${1: -23:2}"; name2="${1: -20:2}"; name3="${1: -17}"; echo mv "$1" "${path1}${name1}${name2}${name3}" ' sh_cp {} \;
# work in progress BSD
# ERROR
# ${1:0...}: Bad substitution
find /cctv/IPC06/* -type f -iname '*.jpg' -exec /bin/sh -c 'p="${1:0:-23}" echo mv "$1" "${p}"' sh_cp {} \;
# test
# this run without error in BSD
find /cctv/IPC06/* -type f -iname '*.jpg' -exec /bin/sh -c 'echo mv "$1" ' sh_cp {} \;
答案1
我解决了:
#!/bin/sh
# find jpg rename and move it
for i in $(find /cctv/IPC06 -mindepth 6 -name '*.jpg'); do j=$(echo $i | cut -c 1-58,60-61,63- ); mv $i $j; done