forループからインタラクティブにコマンドを読む

forループからインタラクティブにコマンドを読む

以下のようにインタラクティブにいくつかのmp3ファイルを削除したいと思います。

$ for i in *.mp3; do mplayer "$i"; echo "$i"; sleep 5; interactive_code; done

Interactive_codeは、私が押すと「$ i」ファイルを削除し、を押すとそのファイルをディレクトリに移動し、rmスペースバーを押すとループを続行する必要があります。tmpmv

答え1

このスクリプトは次のことを行う必要があります。

#!/usr/bin/env bash

for i in ./*.mp3; do

  mplayer "${i}"
  printf '%s\n' "${i}"

  read -p 'What to do?: ' -r ans

  if [[ "${ans}" == 'rm' ]]; then
    rm "${i}"
  elif [[ "${ans}" == 'mv' ]]; then
    mv "${i}" 'tmp'
  fi

done

PS:これはtmpディレクトリがすでに存在し、現在の作業ディレクトリにあると仮定します。別の場所にある場合、またはその/tmpディレクトリを参照している場合は、コードの対応する部分を変更するだけです。

答え2

検証されていません。これは2つのヒントを提供するので、正確にあなたが要求したものではありません。 「y」と入力し、Enter キーを押します。最初ファイルを移動するように求めるプロンプト/tmp(この場合、2番目のプロンプトはスキップされます)または「y」を渡します。第二ファイルを削除するように求められます。両方のプロンプトを無視して(Enterキーを押す)、何もせずに続行します。

find *.mp3 -type f -exec mplayer {} \; \( \
  -ok mv -i {} /tmp \; -o \
  -ok rm {} \; \)

答え3

これにより、ファイルを再生した後にユーザーにメニューが表示されます。

TMPDIR=${TMPDIR:-/tmp}

for name in ./*.mp3; do
    test -f "$name" || continue

    printf 'Playing "%s"...\n' "$name"
    mplayer "$name"

    select ch in "Move $name to $TMPDIR" "Remove $name"; do
        case "$REPLY" in
            1)  mv "$name" "$TMPDIR" ;;
            2)  rm "$name" ;;
            *)  echo 'Invalid choice' >&2
                continue ;;
        esac
        break
    done
done

このスクリプトは必須ではなく、bashどのshシェルでも可能です。

関連情報