検索 - xargs、各行に対して新しいシェルを開き、コマンドを実行し、ユーザーがシェルを終了するのを待ちます。

検索 - xargs、各行に対して新しいシェルを開き、コマンドを実行し、ユーザーがシェルを終了するのを待ちます。

フォローアップ

  • 仕事*AlbumArt*inameファイルを含み、inameも含むすべてのフォルダを一覧表示し、*cover*.jpg各フォルダのサイズとともにすべてのjpgファイルを一覧表示します。

    find . -type f -iname '*AlbumArt*' -print0 | sort -z \
      | xargs -0 -I "{}" bash -c '
      find "$(dirname "${1}")" -maxdepth 1 -iname "*cover*.jpg" -print0' _ "{}" \; \
      | uniq -z | xargs -0 -I "{}" bash -c '
      ls -la "$(dirname "${1}")"/*.jpg;' _ "{}" \;
    
    

私は何をしたいと思うか。

*cover*.jpginameとinameを含むすべてのフォルダを一覧表示し、*AlbumArt*そのフォルダ内の各画像ファイルのサイズを一覧表示し、ノーチラスを開き、それらのフォルダでこれらの画像を手動で確認できるようにしたいと思います(いくつかの追加ファイルを削除したいので)。一度に1つのフォルダを処理します。そのため、xargsのすべての出力に対してls -laノーチラスをオンにし、ノーチラスが閉じるのを待ちたいので、nautilus "${1}"; read -r -p "Press any key to continue" Continue;上に追加しました。

find . -type f -iname '*AlbumArt*' -print0 | sort -z \
  | xargs -0 -I "{}" bash -c '
  find "$(dirname "${1}")" -maxdepth 1 -iname "*cover*.jpg" -print0' _ "{}" \; \
  | uniq -z | xargs -0 -I "{}" bash -c '
  ls -la "$(dirname "${1}")"/*.jpg; nautilus "${1}"; read -r -p "Press any key to continue" Continue;' _ "{}" \;

これは機能しますが、ユーザー入力のために停止しません。つまり、いくつかのread -r -p "Press any key to continue" Continue;ノーチラスウィンドウが開きます!しかし、一度に1つのノーチラスだけを開きたいので、xargsは各行の実行後に待機したいと思います。

xargsが各行を実行した後にユーザー入力を待機させるにはどうすればよいですか?

答え1

コマンドはread呼び出しシェルにあるため、xargs標準入力は/dev/null(ほとんどのxargs実装の場合)または読み取りパイプですxargs。端末から読むには標準入力をリダイレクトしてくださいread … </dev/tty


まだあなたのコードを確認していません。複雑に見えます。すべてのディレクトリを繰り返す方が簡単で、おそらく目立つように遅くはないでしょう。

shopt -s globstar nullglob nocaseglob
# Caveat: this matches symbolic links to directories. And in
# versions of bash prior to 5.0 traverses (some of) those symlinks.
for d in **/*/; do
  a=( "$d"/*albumart*  )
  c=( "$d"/*cover*.jpg )
  if (( ${#a[@]} > 0 && ${#c[@]} > 0} )); then
    ls -ld -- "$d"/*.jpg
    nautilus -- "${c[@]}"
    read -r -p "Press <Return> to continue" Continue
  fi
done

関連情報