首页 > 解决方案 > 简单 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')

我需要做的基本是:

  1. 使用 find 创建一个变量。此变量是前一天(昨天)的相机快照文件夹。脚本的那部分似乎工作正常。
  2. 用于find浏览昨天的文件夹结构,然后用于mv将所有 .jpg 重命名为其创建日期%Y-%m-%d_%H-%M-%S).jpg
  3. 最后,用于rsync将上述文件夹结构中的文件复制到新创建的文件夹中,以便通过 SAMBA 在家庭网络上查看。

当脚本到达脚本的“步骤 2”时,它会重命名文件,但会将它们从原始相机快照文件夹中删除。我不希望这种情况发生。重命名的文件应保留在原处。它也不会在“步骤 3”中将文件复制到我想要的新文件夹中。出于某种原因,它会将文件复制到我从中运行 rsync_script.sh 的根目录中。

那么我的大麻烦在哪里?

标签: bashshellscripting

解决方案


您缺少的最重要的事情是 的-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命令中。


推荐阅读