复制然后在Bash中异步移动文件

时间:2015-10-29 15:17:54

标签: linux bash asynchronous

在Linux系统上,我想循环浏览记忆棒上的一堆文件,将文件复制到硬盘驱动器,然后将记忆棒上的文件移动到同一记忆棒中的另一个目录。

我想异步这样做,所以我可以同时做很多事,但我需要知道每一个完成后我都可以移动它们。

这可以很好地同步(假设已经安装了所有记忆棒):

for FILE in /home/drive_*;
do  

    cp $FILE $DESTINATION
    mv $FILE "otherDir/"$FILE

done

所以这很好,它一次只能处理一个文件,如果文件很大,则需要一段时间。我该如何异步执行此操作?

我知道我可以在复制文件时添加&cp $FILE $DESTINATION &),但我怎么知道它何时完成,以便我可以移动它?

2 个答案:

答案 0 :(得分:4)

为了清楚起见,您要复制然后移动,以便这些任务是同步的。在执行这些任务的同时,您希望继续执行其他任务(更多副本然后移动)。

我相信以下是你所寻求的:

for FILE in /home/drive_*
do
    (cp $FILE $DESTINATION && mv $FILE "otherDir/"$FILE &)
done

您可以看到cpmv是连续的,但执行仍在继续。

我应该注意到,我怀疑你会看到使用它的性能有任何改善,它实际上可能会变得更糟。磁盘读写速度相对较慢,磁盘可能无法一次读写多个文件。我建议只使用顺序脚本。

答案 1 :(得分:2)

您只需将指令分组为bash函数,然后将其置于后台(异步调用)。

$ function xxx { sleep $1; echo $2; }
$ xxx 5 "long file" &
[1] 10704
$ xxx 2 "short file"&
[2] 10706
$ wait
<here it is waiting for both process to  be completed>
short file
long file
[1]-  Done                    xxx 5 "long file"
[2]+  Done                    xxx 2 "short file"

所以,如果我在你的例子中使用一个函数,它将是:

function cp_and_move
{
  cp $1 $2
  mv $1 "otherDir/"$1
}    
for i in /home/drive_*; do  
        cp_and_move $FILE $DESTINATION &
done;
wait