在 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

未经测试。这并不完全是您所要求的,因为它给出了两个提示。输入“y”并按回车键第一的提示将文件移至/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,任何shshell 都可以。

相关内容