2016-02-17 91 views
1

我有一个文件夹,每隔5分钟就有一个文件。假设每个文件的文件名都是'Test-HHMM.png',我想检查每个文件的存在。到目前为止,这是我的。GNU并行 - 这些嵌套的并行可以是单个并行调用吗?

parallel "[ -f {1} ] || echo '{1} - Nope'" ::: $(parallel printf %s-%02d%02d.png\\\\n {1} {2} {3} ::: 'Test' ::: $(seq 0 23) ::: $(seq 0 5 55)) 

所以这是给parallel第一个呼叫,它使用printf创造了一系列的文件名,使用2个电话seq生成小时和分钟。然后第二次拨打parallel对每个文件名进行-f测试。

这似乎可能只是一个电话parallel,其中命令是-f测试所有参数的$(printf)的结果。但我似乎无法得到正确的语法。我似乎也无法将命令分解为子命令,然后进行连接,以便于阅读。

有什么想法?使用parallel错误似乎很危险;感觉像使用循环会更好。

更新 这里是我的问题的简化版本 - 看起来很普通,但我可以从此建立到我需要的东西。目前,我有这样的:

parallel echo $(printf %02d {1}) ::: $(seq 1 10)

我预计这将打印 01 02 ... 10

相反,我得到 ./foo.sh: line 7: printf: {1}: invalid number 00 1 00 2 ... 00 10

不知道为什么。试过的“许多组合和”无efefect

感谢

回答

1

第一:!你确定这是不是一个XY problem

如果要监视一个目录,以查看是否有新文件由呢?这是更好的:

inotifywait -q -m -r -e MOVED_TO -e CLOSE_WRITE --format %w%f my_dir | parallel -u echo 

但是,如果你真的想看看,如果该文件存在,那么Perl中的单回路便一路快:在任务,除几个毫秒需要更长的时间GNU并行过人之处运行。

perl -e 'print map {$_."\n"} grep { ! -e $_ } map { $a=$_*5; map { sprintf "Test-%02d%02d.png", $_,$a } "00"..23 } 0..11' | 
    parallel echo {} - Nope 

在这里,我假设你真的想做一些比echo更严重的事情。否则,你应该简单地在print之后使用map

编辑:

如果运行时间不是问题,那么这是一个相当紧凑的方式做同样的:

parallel [ -f Test-{1}{2} ] "||" echo Test-{1}{2} - Nope ::: {00..23} ::: {00..55..5} 

如果要运行什么更复杂的制作功能:

mytest() { 
    file="$1" 
    if [ -f "$file" ] ; then 
    true 
    else 
    echo "$file" - Nope 
    fi 
} 
export -f mytest 
parallel mytest Test-{1}{2} ::: {00..23} ::: {00..55..5} 
+0

因为OP可能不熟悉'perl',所以我会将代码放在多行'.pl'中,并添加[extra]注释以帮助OP理解脚本正在做什么。他会更有可能以这种方式使用它(如果他了解并因此相信它足以超越bash“舒适区”)。如果这是更好的工具[尤其是IMO,作为一名经验丰富的'perl'程序员,它通常是],那么情况尤其如此。 –

+0

其实这个要求就像我描述的那样:)一个简单的bash脚本,用于列出时间序列中的哪些文件由于某种原因而丢失。没有perl等不是功课;更像是控制其他开发人员编写1000多行代码而不是使用'imagemagick'等。(Spoiler:他们按小时付费) –

+0

@CraigEstey我必须同意。我对Perl很熟悉,但写的脚本对我没有任何好处。对不起,没有人赞赏。 –

0

在我的编辑中引用我的简化示例...这不起作用

parallel echo $(printf %02d {1}) ::: $(seq 1 10)

...但是这确实

parallel echo "\$(printf %02d {1})" ::: $(seq 1 10)

的问题是我需要逃避parallel$这样表达会得到评估,而不是由bash

所以解决我原来的问题变得

parallel "file=\$(printf %s-%02d%02d.kml {1} {2} {3}) && [ -f \$file ] || echo \$file - Nope" ::: 'Foo' ::: $(seq 0 23) ::: $(seq 0 5 55)

,其额外分配$(printf)给一个变量的结果,所以我不必调用printf不止一次。当我将printf命令分配给一个变量时,即使我想重新使用它,它也能正常工作。所以我觉得我很好。

感谢您的回答&评论家伙。

+0

@ OleTange我将你的答案留作Approved,因为它比我的信息多一点。另外我不确定批准你自己的答案甚至是允许的。 –