TL;博士:
问:如何保持计数器find -exec
循环?
我的用例:
我需要移动很多分散在这个地方的目录,所以我这样做了
find . -type d -name "prefix_*" \
-exec sh -c '
new_path="/new/path/$(basedir "$1")";
[ -d "$new_path" ] || mv "$1" "$new_path";
' find_sh {} \;
(真正的命令更复杂,因为我阅读了 . 的构成的一些元数据/new/path
。无论如何,我不想争论命令本身,这不是问题的一部分,只是用例)。
它工作得很好,但需要很长时间,我想跟踪进度。
所以我添加了一个写入文件的计数器:
i=$(cat ~/find_increment || echo 0);
echo $((i+1)) | tee ~/find_increment;
这也可以正常工作,但是拥有大约 100.000 次磁盘读写操作感觉真的很糟糕。
我考虑过写入ramdisk
而不是磁盘,但在我需要执行该任务的环境中我没有该选项。
有没有更好的方法在运行之间保持计数器-exec
?
find
您可以find
与while read
循环或 GNU结合使用,而不是使用纯命令parallel
。两者都可能比find
's更快,-exec
因为您不会为find
.使用 GNU Parallel 的解决方案
parallel
与 GNU相比,GNU具有以下优点while read
:IFS=
而且-r
需要。{#}
。如需更方便的替换字符串,请查看教程。
删除
-j1
并且默认情况下您拥有与核心一样多的工作人员。{}
替换为parallel
从 中读取的正确引用的条目stdin
。不要{}
再次引用。parallel
使用与您启动脚本相同的 shell 执行脚本。如果您从一开始parallel
就bash
可以使用bash
脚本中的功能。使用 While Read 的解决方案
如果可用,请将计数器存储在其中
/dev/shm/
以防止磁盘写入。=> 使用
/dev/shm/find_increment
而不是~/find_increment
.