在Linux系统上,我想循环浏览记忆棒上的一堆文件,将文件复制到硬盘驱动器,然后将记忆棒上的文件移动到同一记忆棒中的另一个目录。
我想异步这样做,所以我可以同时做很多事,但我需要知道每一个完成后我都可以移动它们。
这可以很好地同步(假设已经安装了所有记忆棒):
for FILE in /home/drive_*;
do
cp $FILE $DESTINATION
mv $FILE "otherDir/"$FILE
done
所以这很好,它一次只能处理一个文件,如果文件很大,则需要一段时间。我该如何异步执行此操作?
我知道我可以在复制文件时添加&
(cp $FILE $DESTINATION &
),但我怎么知道它何时完成,以便我可以移动它?
答案 0 :(得分:4)
为了清楚起见,您要复制然后移动,以便这些任务是同步的。在执行这些任务的同时,您希望继续执行其他任务(更多副本然后移动)。
我相信以下是你所寻求的:
for FILE in /home/drive_*
do
(cp $FILE $DESTINATION && mv $FILE "otherDir/"$FILE &)
done
您可以看到cp
和mv
是连续的,但执行仍在继续。
我应该注意到,我怀疑你会看到使用它的性能有任何改善,它实际上可能会变得更糟。磁盘读写速度相对较慢,磁盘可能无法一次读写多个文件。我建议只使用顺序脚本。
答案 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