我需要编写一个shell脚本作为cron任务运行,或者最好是在某个文件夹中创建一个文件。
我有一个incoming
和一个outgoing
文件夹(它们将用于记录邮件)。将使用以下代码创建文件...
bmo-001-012-dfd-11
表示传出,012-dfd-003-11
表示传入。我需要过滤项目/客户端代码(012-dfd
),然后将其放在特定项目文件夹的文件夹中。
项目文件夹位于/projects
,其格式为012-dfd
。我需要在项目的传入或传出文件夹中创建符号链接,从而在常规incoming
和outgoing
文件夹中生成正确的文件。
/incoming/012-dfd-003-11.pdf -> /projects/012-dfd/incoming/012-dfd-003-11.pdf
/outgoing/bmo-001-012-dfd-11.pdf -> /projects/012-dfd/outgoing/bmo-001-012-dfd-11.pdf
所以我的问题
while inotifywait outgoing; do find -L . -type l -delete; ls outgoing | php -R '
if(
preg_match("/^\w{3}-\d{3}-(\d{3}-\w{3})-\d{2}(.+)$/", $argn, $m)
&& $m[1] && (file_exists("projects/$m[1]/outgoing/$argn") != TRUE)
){
`ln -s $(pwd)/outgoing/$argn projects/$m[1]/outgoing/$argn;`;
}
'; done;
这非常有效 - 清理已删除的符号链接(使用find -L . -type l -delete
)但我更喜欢这样做而没有调用php的开销。我还不太了解bash。
答案 0 :(得分:1)
How would I make my script run when a file is added to either incoming or outgoing folder Additionally, is there any associated disadvantages with running upon file modification compared with running as cron task
每5分钟
如果5分钟的延迟不是问题,我会选择cron工作(它更容易,并且-IMHO-更灵活)
我如何获取最近(自上次运行脚本)文件的文件名
如果您的脚本每5分钟运行一次,那么您可以使用命令 ls 或 find <来判断现在(现在 - 5分钟)之间创建的所有文件是否为newso / em>你可以列出这些文件。
如何从文件名中提取代码
您可以使用 sed 命令
如何使用代码在所需的文件夹中创建符号链接
获得所需的文件名后,可以使用 ln -s 命令创建符号链接
答案 1 :(得分:1)
您的任务分解的一些近乎答案:
假设项目名称可以从您的示例中提取位置(意味着项目名称不仅遵循严格的7字符格式,而且在之前在传出文件中也是如此一样):
echo `basename /incoming/012-dfd-003-11.pdf` | cut -c 1-7
012-dfd
echo `basename /outgoing/bmo-001-012-dfd-11.pdf`| cut -c 9-15
012-dfd
mkdir -p /projects/$i/incoming/
创建目录/projects/012-dfd/incoming/
if i = 012-dfd
,ln -s /incoming/foo /projects/$i/incoming/foo
创建一个从后一个参数到先前存在的前文件/incoming/foo
的符号链接。