「sem」を使用してスクリプトを並列に実行する

「sem」を使用してスクリプトを並列に実行する

私はまったく同じ内容のディレクトリを識別するために使用したい次のシェルスクリプト(1行)を持っています。私はこれを重複した(サブ)ディレクトリを識別して削除するために使用しています。

を使用して同じスクリプトを実行しようとするとエラーが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 directoryスクリプトからどのようにsem削除/修正できますか?
  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

関連情報