定期将文件移动到新目录的脚本

定期将文件移动到新目录的脚本

我是 Linux 新手,正在寻找脚本方面的帮助。我正在使用 Resilio 备份我们 iPhone 上的照片。它们位于“/media/data/phones/myiphone/resilio”

不幸的是,resilio 会将照片导入 iOS 文件夹中,每个文件夹最多可包含 100 张照片。当文件夹填满时,iOS 会创建一个新的随机 DCIM 文件夹(100APPLE 等),因此文件夹会根据 iPhone 的要求定期添加到 /resilio 目录中。这是我觉得棘手的部分,因为我不想每次添加新的 DCIM 文件夹时都更改脚本。

我想提取每个“iOS”文件夹中的所有图片和视频,并将它们移动到一个新的单个目录中,以便所有图片都在一个文件夹中(抱歉,目录):

/media/data/phones/myiphone/pics

我希望每天做一次这个。

(然后图片目录将同步到我的 Windows 机器,我可以在那里编辑照片等,但这不是我需要帮助的部分。)

如果有人能从头到尾指导我,包括如何安排脚本运行,我将不胜感激。假装您正在向幼儿园小朋友(可以阅读和打字)解释。

我很乐意澄清任何不清楚的地方。谢谢!!

答案1

首先编写一个简单的脚本,将图片/视频移动到所需目录。类似于以下内容,位于名为“backupPhotos.sh”的文件中。我必须假设您知道如何使用文本编辑器。

#!/bin/bash

cd /media/data/phones/myiphone/resilio
find . -type f -exec mv {} ../pics \;

第一行表示使用 /bin/bash(通常是您在终端窗口中使用的默认 shell)运行此脚本。以“cd”开头的行将当前工作目录更改为 Resilio 保存照片的目录。最后一行将 resilio 目录下的所有文件移动到 pics 目录(仅文件将被移动“-type f”,而不是目录结构。

然后做:

chmod 755 backupPhotos.sh
mkdir /media/data/phones/myiphone/pics

chmod 命令告诉 Ubuntu 该文件包含可执行脚本。mkdir 命令创建“pics”目录来保存图片/视频。如果您已经有 pics 目录,则无需执行 mkdir。

通过输入命令来试用该脚本

./backupPhotos.sh

在您创建该文件的目录中。请采取预防措施,确保在此测试阶段将图片保存在其他地方,以防出现问题。运行脚本后,“resilio”下的所有目录都应为空,所有图片/视频都应位于“pics”目录中。

一旦你确信它正常工作,你可以使用 crontab 安排它运行。在执行下一个命令之前,你应该通过输入以下内容来识别你首选的文本编辑器

export EDITOR=gedit

这会将您的首选编辑器设置为“gedit”(暂时)。将“gedit”替换为您喜欢并已安装的任何文本编辑器。然后输入命令

crontab -e

这会将您带到您最喜欢的编辑器中,其中有一个可能为空的 crontab 文件。crontb 文件中应该有一些文本,但应该用“#”字符注释掉它们。您将在文件末尾添加一行来安排运行新脚本。该行将是:

0 5 * * * /path_to_script_directory/backupPhotos.sh

其中“path_to_script_directory”是脚本所在位置的完整路径(类似于 /home/mkinsocal)。三个星号表示每天运行脚本。“0 5”表示在凌晨 5 点 0 分运行。请注意,您必须每天凌晨 5 点启动并运行计算机才能实现此功能。将行添加到 crontab 文件后,保存它,就大功告成了。

答案2

我认为您有一个类似 的文件夹结构/media/data/phones/myiphone/pics/100APPLE/media/data/phones/myiphone/pics/101APPLE等等。这可以通过以下方法解决通配符. Glob 基本上使用特殊字符作为通配符。

  • * 表示任意字符、任意次数,包括零次。
  • ? 表示任意字符,至少一次。
  • [abc] 将匹配列出的一个字符,至少出现一次。
  • [az] 将匹配间隔内的一个字符。

因此ls [0-9]foo将匹配1foo9foo,但 不会12foo*foo将匹配两者。

因此,最简单的 glob 可能是 ???APPLE,以匹配名称中有 8 个字符、以 APPLE 结尾但有三个未知起始字符的任何文件夹。

可以使用 * 来匹配里面的任何文件,例如ls ???APPLE/*将列出所有这些文件夹中的所有文件。

我在这里使用 ls 作为示例,但是通配符是由 shell 处理的,并且您可以同样好地 mv 文件而不是列出它们 - 或者列出它们,然后运行 ​​for 循环。

另一种方法是使用 find,正如@Drymartini 所建议的那样。简而言之,您有多种可能性。

答案3

你可以这样做man find

像这样的事情会有所帮助:

find ./ -iname *.jp?g -exec cp '{}' photosDir/ \;

相关内容