我正在尝试使用 Mac OSX 中的终端对 NAS 上的文件进行排序。我计划使用以下步骤:
- 为特定年份创建文件夹
- 为每个月创建文件夹
- 使用“查找”命令识别年份和月份并将文件移动到相关文件夹。
我已经为步骤 1 至 2 创建了 2 个可执行文件。我仍在研究为步骤 3 设置第 3 个文件,但遇到了问题。
详情请见:
文件 1:“MakeMediaYearFolders.command”包含以下代码行
#! /bin/bash
xargs -tI % mkdir % < MediaYearFolders.csv
其中:“MediaYearFolders.csv”包含以下几行
Media - 1999
Media - 2000
...
Media - 2020
文件 2:“MakeMonthsFolder.command”包含以下代码行
#! /bin/bash
cd /Users/Name/Desktop/DROBO TEST/2. SORTED/Media - 1999/
xargs -tI % mkdir % < MonthsFolders.csv
“MonthsFolders.csv” 包含以下几行
01 - January
...
12 - December
文件 3:目前有以下内容
#! /bin/bash
cp -fv /Users/name/Desktop/DROBO TEST/2. SORTED/MonthsFolders.csv /Users/name/Desktop/DROBO TEST/2. SORTED/Media - 1999
cp -fv /Users/name/Desktop/DROBO TEST/2. SORTED/MakeMonthsFolder.command /Users/name/Desktop/DROBO TEST/2. SORTED/Media - 1999
Cd /Users/name/Desktop/DROBO TEST/2. SORTED/Media - 1999
xargs -tI % mkdir % < MonthsFolders.csv
我面临的问题有很多,我不太确定如何解决它们:
- 问题 1:我无法为步骤 1 和 2 创建单个文件,因为我不确定如何强制在每个“媒体 - 年份”文件夹中创建“月份”文件夹。当我尝试时,文件根本没有被复制,也没有显示任何错误消息。此外,“月份”文件夹是在包含“媒体 - 年份”文件夹的根文件夹中创建的
- 问题 2:我必须手动启动每个“媒体 - 年份”文件夹的“月份”文件夹的创建。最重要的是,我还必须复制每个“媒体 - 年份”文件夹中的“CSV”文件和可执行文件!真的很耗时。我不太清楚如何强制在每个“媒体 - 年份”中创建“月份”文件夹。事实上,要创建文件夹,我必须使用每个文件夹中的“./MakeMonthsFolder.command”启动该过程。
- 问题 3:使用“find”命令时,我无法移动相关文件。我使用以下命令:
find /Users/name/Desktop/DROBO\ TEST/1.\ SOURCE -name "201704*" -exec mv -v -- /Users/name/Desktop/DROBO\ TEST/1.\ SOURCE /Users/name/Desktop/DROBO\ TEST/Media\ -\ 2017/04\ -\ April
。我从系统收到以下消息:find: -exec: no terminating ";" or "+"
。我不太清楚如何解释这一点,更不用说采取行动了 ;-)
锦上添花:我如何获取“您在 /var/mail/name 中有新邮件”的消息邮件?基本上我想我的问题是我如何到达那里?
有什么帮助或建议吗?
谢谢大家
答案1
这个shell脚本虽然效率不高,但是实现了第1步和第2步:
#!/bin/sh
while read -r year; do
if [ -n "$year" ]; then
mkdir "$year"
else
continue
fi
while read -r month; do
if [ -n "$month" ]; then
mkdir "$year/$month"
else
continue
fi
done < MonthsFolders.csv
done < MediaYearFolders.csv
它只是从 中读取每一行MediaYearFolders.csv
,用该名称创建一个目录,然后从 中读取月份,为其内部创建目录MonthsFolders.csv
。 if 子句保证在创建目录时年份和月份变量都不为空。
find
语法可能有点棘手。正确的写法是
find /Users/name/Desktop/DROBO\ TEST/1.\ SOURCE -name "201704*" -exec mv -v -- {} /Users/name/Desktop/DROBO\ TEST/Media\ -\ 2017/04\ -\ April \;
如您所见,每个找到的文件都会进入,{}
并且 -exec 位以 终止\;
。man find
有关更多信息,请参阅。
注意:您需要用引号保护包含空格的字符串或转义空格字符:
cd /Users/.../DROBO TEST
→cd "/Users/.../DROBO TEST"
cd /Users/.../DROBO TEST
→cd /Users/.../DROBO\ TEST