将子文件夹中的特定文件类型移动到目标文件夹,但不丢失子文件夹结构

将子文件夹中的特定文件类型移动到目标文件夹,但不丢失子文件夹结构

首先,我对 Linux 的了解非常有限,但我总是尽力而为。我还已经通过使用 Cronjobs 和脚本在我的 Unraid Server 和 RPi 中自动化了很多事情,但现在我有点迷失了。

以下情况:我正在使用 icloud 照片下载器自动将 icloud 存储中的所有照片和视频下载到本地 NAS。它使用子文件夹结构 /yyyy/mm/ 并下载 .jpg 和 .mov,例如今天拍摄的视频将在今晚下载到 /2020/12/IMG_0123.mov

此外,我使用“handbrake”将 .mov 转换为 .mkv,因为 mkv 可以在我的所有设备上播放,而 .mov 总是希望在 Plex 等中进行转换。对于 Handbrake,我设法拥有一个监视文件夹(/videowatch/)和一个输出文件夹(/videooutput/),handbrake 使用它来自动转换我在监视文件夹中复制的视频文件,并通过重新创建相同的文件夹结构将其导出到输出文件夹。示例:我将上面提到的视频文件复制到子文件夹/videowatch/2020/12/IMG_0123.mov,handbrake会将其转码为mkv并将文件导出到/videooutput/2020/12/IMG_0123.mkv。然后.mov 将被删除。

这一步是我目前手动执行的操作,并且希望将其自动化。

我该如何管理这个脚本?应执行以下步骤:

  1. 在所有子文件夹中搜索 .mov 类型的文件
  2. 将所有找到的 .mov 文件移至文件夹 /videowatch/ 但重新创建子文件夹结构

示例:icloudpd 在文件夹 /2020/11/ 以及 /2020/12/ 中下载两个新的 .mov(file1.mov 和 file2.mov)。这两个文件夹已经存储了很多其他 .jpg 和 .mkv 文件

  1. 该脚本识别两个 .mov 文件 /2020/11/file1.mov 和 /2020/12/file2.mov
  2. 该脚本将这两个文件移动到文件夹 /videowatch/ 并重新创建子文件夹结构。然后我们将有 /videowatch/2020/11/file1.mov 和 /videowatch/2020/12/file2.mov

那可能吗?最后一步,应将 videooutput 文件夹的内容移回 / 以将新的 mkv 文件移至以前的 .mov 文件的目标文件夹。由于 handbrake 保留子文件夹结构,因此可以通过 crontab 中的 mv 条目轻松处理。

希望我没有把它描述得太复杂。

非常感谢你的帮助!


我只是在努力编写将 .mov 文件移动到监视文件夹(包括文件夹结构)的脚本。

例如我可以使用 find 来搜索文件:

find . -name "*.MOV" -type f 

这带来了:

./2008/08/CIMG0035.MOV 
./2010/11/IMG_0212.MOV

然后,这两个文件应移动到监视文件夹,最后如下所示:

./videowatch/2008/08/CIMG0035.MOV
./videowatch/2010/11/IMG_0212.MOV

我能够自己处理所有其他事情(手刹、icloudpd、cronjob 等)。

我可以用

find . -name "*.MOV" -type f -exec mv '{}' /watchfolder/ \;

然后,这会将 find 命令识别的所有 .MOV 移动到监视文件夹主文件夹中,但没有任何层次结构和子文件夹。因此,我没有按年/月列出相应文件夹中的所有文件。

./videowatch/CIMG0035.MOV 
./videowatch/IMG_0212.MOV 

但这不是我想要的,我想要/需要它包括年/月的子文件夹,因为文件位于源文件夹中。

谢谢!

答案1

您可以调用 shell 脚本并使用此问题的解决方案之一:如果目录不存在,有没有办法让 mv 创建要移动到的目录?

您也可以使用rsync/--include--exclude同步您想要的内容,然后手动删除。

或者find仅用于创建文件列表,然后您将从执行所有其他任务的脚本中读取该列表(现在还将执行移动)。在这种情况下,mkdir -p在移动之前做一下就可以解决问题。

请注意,您正在移动的文件可能会也可能不会完全下载。您需要有一种方法来知道它们是否在运行脚本时完全从云端传输。执行此操作的方法取决于执行下载的工具,可能是存在隐藏文件,或者您可以通过fuser对要移动的文件进行操作来找到该文件。否则,您可能会面临丢失数据的风险。

相关内容