简单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
浏览昨天的文件夹结构,然后使用mv
将所有.jpg重命名为其创建日期%Y-%m-%d\u%H-%m-%s)。jpg
rsync
将所述文件夹结构中的文件复制到新创建的文件夹中,以便通过SAMBA在家庭网络上更容易查看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”
完成
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') +