bash - 简单 bash find/mv/rsync 脚本的问题
问题描述
已经为此工作了一段时间,但我不得不认输并寻求帮助。
这是到目前为止的脚本:
#!/bin/bash
# Sets variable to yesterday's date so we can get into the correct directory we need.
YEST=/mnt/cam_recordings/frontcam/5MF50Z6BPDC5286/$(date -d '-1 day' '+%Y-%m-%d')
# Renames all of yesterday's .jpgs in cam snapshot folders to creation time since
# the camera sometimes duplicates snapshot names.
find $YEST -type f -name '*.jpg' -exec sh -c '
for f; do
mv -f -- "$f" "$(date -r "$f" +%Y-%m-%d_%H-%M-%S).jpg"
done' _ {} +
# Copies renamed .jpgs from the cam snapshot folder
# and into a SAMBA share by creating a folder with yesterday's
# date for easy viewing.
find $YEST -name \*.jpg | rsync -av --files-from - --no-relative / /mnt/camsnaps/$(date -d '-1 day' '+%Y-%m-%d')
我需要做的基本是:
- 使用 find 创建一个变量。此变量是前一天(昨天)的相机快照文件夹。脚本的那部分似乎工作正常。
- 用于
find
浏览昨天的文件夹结构,然后用于mv
将所有 .jpg 重命名为其创建日期%Y-%m-%d_%H-%M-%S).jpg
- 最后,用于
rsync
将上述文件夹结构中的文件复制到新创建的文件夹中,以便通过 SAMBA 在家庭网络上查看。
当脚本到达脚本的“步骤 2”时,它会重命名文件,但会将它们从原始相机快照文件夹中删除。我不希望这种情况发生。重命名的文件应保留在原处。它也不会在“步骤 3”中将文件复制到我想要的新文件夹中。出于某种原因,它会将文件复制到我从中运行 rsync_script.sh 的根目录中。
那么我的大麻烦在哪里?
解决方案
您缺少的最重要的事情是 的-execdir
选项find
,它以找到的文件的目录作为“当前目录”执行。
find $YEST -type f -name '*.jpg' -execdir mv -f {} "$(date -r {} +%Y-%m-%d_%H-%M-%S).jpg" \;
find $YEST -name \*.jpg -execdir cp {} /mnt/camsnaps/$(date -d '-1 day' '+%Y-%m-%d') +
该+
版本将所有文件收集到一个cp
命令中。
推荐阅读
- typescript - 猫鼬模式的函数参数类型,在 Typescript 中?
- spring-batch - Spring批量读取从xml写入csv文件
- python-3.x - 安装 python 模块,然后使用 .bat 文件运行 python 脚本
- c# - 在 ASP.NET C# 中使用 SQL 查询对 Datatable 行着色
- javascript - 异步获取数据不重新渲染 ReactJS 数据表(或只是不显示新数据)
- python - 如何在 Matplotlib 中剪切长标签
- java - 我想在java中只创建内存中的rocksDB
- c# - ASP.NET - 单击图像应重定向到具有图像 url 的特定页面
- ocaml - 在 OCaml 中分隔多个“let”声明,后跟一个“let in”表达式
- c - 如何为 char* 释放内存