简单bash find/mv/rsync脚本存在问题

简单bash find/mv/rsync脚本存在问题,bash,shell,scripting,Bash,Shell,Scripting,我已经为此努力了一段时间,但我不得不认输并寻求帮助 以下是迄今为止的脚本: #!/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 .

我已经为此努力了一段时间,但我不得不认输并寻求帮助

以下是迄今为止的脚本:

#!/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\u%H-%m-%s)。jpg
  • 最后,使用
    rsync
    将所述文件夹结构中的文件复制到新创建的文件夹中,以便通过SAMBA在家庭网络上更容易查看
  • 当脚本到达脚本的“步骤2”时,它将重命名文件,但将其从原始相机快照文件夹中删除。我不想发生这种事。重命名的文件应保留在原来的位置。它也不会将文件复制到我希望它在“步骤3”中保存的新文件夹中。出于某种原因,它将文件复制到我运行rsync_script.sh的根目录中

    我的大麻烦在哪里

  • 不要用find让mutli行的执行官感到困惑,这比它需要的更难理解
  • files=($(查找$YEST-type f-name'*.jpg'))
    对于“${files[@]}”中的f;做
    mv-f--“$f”“$(日期-r“$f”+%Y-%m-%d_%H-%m-%S).jpg”
    完成
    
  • 您正在将文件从完整路径(例如,
    /mnt/cam_recordings/frontcam/5mf50z6bpcdc5286/blahblahblah.jpg
    移动到文件名(例如,
    newblahblah.jpg
    mv
    正是这样做的。没有路径的文件只是当前路径中的文件,所以它将它们放置在当前路径中。你需要给他们一条路径,或者改变你当前的路径。由于您希望它们保留在当前的
    $YEST
    子目录中,因此我们必须使用
    dirname
    获取目录名并将其前置到新文件名:
  • files=($(查找$YEST-type f-name'*.jpg'))
    对于f,在$files中;做
    mv-f--“$f”“$(目录名“$f”)/$(日期-r“$f”+%Y-%m-%d_%H-%m-%S).jpg”
    完成
    
  • 不要用find让mutli行的执行官感到困惑,这比它需要的更难理解
  • files=($(查找$YEST-type f-name'*.jpg'))
    对于“${files[@]}”中的f;做
    mv-f--“$f”“$(日期-r“$f”+%Y-%m-%d_%H-%m-%S).jpg”
    完成
    
  • 您正在将文件从完整路径(例如,
    /mnt/cam_recordings/frontcam/5mf50z6bpcdc5286/blahblahblah.jpg
    移动到文件名(例如,
    newblahblah.jpg
    mv
    正是这样做的。没有路径的文件只是当前路径中的文件,所以它将它们放置在当前路径中。你需要给他们一条路径,或者改变你当前的路径。由于您希望它们保留在当前的
    $YEST
    子目录中,因此我们必须使用
    dirname
    获取目录名并将其前置到新文件名:
  • files=($(查找$YEST-type f-name'*.jpg'))
    对于f,在$files中;做
    mv-f--“$f”“$(目录名“$f”)/$(日期-r“$f”+%Y-%m-%d_%H-%m-%S).jpg”
    完成
    
    您缺少的最重要的是
    -execdir
    选项
    find
    ,它以找到的文件目录作为“当前目录”执行


    +
    版本将所有文件收集到一个
    cp
    命令中。

    您缺少的最大一点是
    查找
    -execdir
    选项,该选项以找到的文件目录作为“当前目录”执行


    +
    版本将所有文件收集到一个
    cp
    命令中。

    --来自
    -
    的文件之间缺少
    =
    。应该是
    --files from=-
    您在
    --files from
    --
    之间缺少
    =
    。应该是
    --files from=-
    ,因此您的2号解决方案并没有像我所期望的那样工作。它不会将文件保留在当前文件夹中。它将它们上移到$YEST的根。这些文件位于$YEST下的更深嵌套文件夹中。所以我需要它们留在当前文件夹中,但在其中重命名$YEST只是一个起点。这些文件位于$YEST内的小时和分钟目录中。@Biggen,经过编辑可用于所需的文件夹结构。MV代表“移动”。它移动文件,这意味着文件不再位于旧位置,而是位于新位置。如果您希望文件同时位于旧位置和新位置,请改用cp(复制)。@bk_32,我知道移动的作用。他没有要求复制文件,在这种情况下,重命名将不起作用,因为文件的新名称来自每个文件的日期戳。我没有告诉你,我是在告诉Biggen,因为他似乎不明白为什么要从原始位置删除文件。如果你注意到的话,我的评论是对比根评论的回应,而不是你的。所以你的第二号解决方案并没有像我所想的那样有效。它不会将文件保留在当前文件夹中。它将它们上移到$YEST的根。这些文件位于$YEST下的更深嵌套文件夹中。所以我需要它们留在当前文件夹中,但在其中重命名$YEST只是一个起点。这些文件位于$YEST内的小时和分钟目录中。@Biggen,经过编辑可用于所需的文件夹结构。MV代表“移动”。它移动文件,这意味着文件不再位于旧位置,而是位于新位置。如果您希望文件同时位于旧位置和新位置,请改用cp(复制)。@bk_32,我知道移动的作用。他没有要求复制文件,在这种情况下,重命名将不起作用,因为文件的新名称来自每个文件的日期戳。我没有告诉你,我是在告诉Biggen,因为他似乎不明白为什么要从原始位置删除文件。如果你注意到的话,我的评论是对比根评论的回应,而不是你的。
    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') +