使用“sem”使脚本并行运行

使用“sem”使脚本并行运行

我有以下 shell 脚本(一行),我想用它来识别具有完全相同内容的目录。我正在使用它来识别和删除重复的(子)目录。

当我尝试使用 运行相同的脚本时sem,我遇到了No such file or directory错误。

示例 - 无并行线程

find -type d -links 2 | while read i; do \
   find "$i" -type f -print0 | xargs -r0 md5sum | awk '{ print $1 }' \
   | sort | md5sum | xargs -I {} echo {} $i ; \
   done

给我:

e94d32e2a683d46d49c7580d649f7888  - ./Daft Punk/Alive 2007 2
e94d32e2a683d46d49c7580d649f7888  - ./Daft Punk/Alive 2007

示例 - 使用 sem

find -type d -links 2 | while read i; do sem -j+0 \
   find "$i" -type f -print0 | xargs -r0 md5sum | awk '{ print $1 }' \
   | sort | md5sum | xargs -I {} echo {} $i ; \
   done; sem --wait

给我:

find: `./Daft': No such file or directory
find: `Punk/Alive': No such file or directory
find: `2007': No such file or directory
find: `2': No such file or directory
d41d8cd98f00b204e9800998ecf8427e  - ./Daft Punk/Alive 2007 2
find: `./Daft': No such file or directory
find: `Punk/Alive': No such file or directory
find: `2007': No such file or directory
d41d8cd98f00b204e9800998ecf8427e  - ./Daft Punk/Alive 2007

问题:

  1. 为什么行为上有差异?
  2. 如何No such file or directorysem脚本中删除/修复?
  3. 我还可以在脚本中进行其他改进吗? (有很多awkxargs

答案1

最简单的解决方案是引用传递给 sem 的命令:

sem -j+0 "find \"$i\" -type f -print0"

您可以在此示例中看到差异

$ sem -j 8 echo "a  a" 
a a
$ sem -j 8 'echo "a  a"' 
a  a

答案2

使用并行代替:

doit() {
  i="$1"
  find "$i" -type f -print0 | xargs -r0 cat | md5sum |
    awk '{ print $1 }' |
    sort | md5sum
}
export -f doit
find -type d -links 2 | parallel --tag doit

相关内容