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

추신: 이는 tmp디렉토리가 이미 존재하고 현재 작업 디렉토리에 있다고 가정합니다. 다른 곳에 있거나 해당 /tmp디렉터리를 참조하는 경우 코드의 해당 부분을 변경하면 됩니다.

답변2

검증되지 않은. 이는 두 가지 힌트를 제공하므로 정확히 귀하가 요청한 내용이 아닙니다. "y"를 입력하고 Enter 키를 누릅니다.첫 번째파일을 이동하라는 프롬프트 /tmp(이 경우 두 번째 프롬프트는 건너뛰게 됩니다) 또는 '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쉘에서도 가능합니다.

관련 정보