linux server从文件名创建符号链接

时间:2011-12-27 13:46:42

标签: linux bash shell

我需要编写一个shell脚本作为cron任务运行,或者最好是在某个文件夹中创建一个文件。

我有一个incoming和一个outgoing文件夹(它们将用于记录邮件)。将使用以下代码创建文件...

bmo-001-012-dfd-11表示传出,012-dfd-003-11表示传入。我需要过滤项目/客户端代码(012-dfd),然后将其放在特定项目文件夹的文件夹中。

项目文件夹位于/projects,其格式为012-dfd。我需要在项目的传入或传出文件夹中创建符号链接,从而在常规incomingoutgoing文件夹中生成正确的文件。

/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

所以我的问题

  1. 将文件添加到传入或传出文件夹时,如何使脚本运行
    1. 此外,与每隔5分钟作为cron任务运行相比,运行文件修改是否存在任何相关缺点
  2. 我如何获取最近的文件名(自上次运行以来的文件)
  3. 如何从文件名中提取代码
  4. 如何使用代码在所需的文件夹中创建符号链接

  5. 编辑:我最终做了什么...

    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。

2 个答案:

答案 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)

您的任务分解的一些近乎答案:

  1. 在Linux上,使用inotify,可能是command-line toolsscript language bindings之一。
  2. 见上文
  3. 假设项目名称可以从您的示例中提取位置(意味着项目名称不仅遵循严格的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的符号链接。