Bash 带有 Xargs 提示的脚本?

Bash Script with Prompts from Xargs?

我有一个正在尝试的脚本 运行:

#!/bin/bash
echo "Please enter desired kbps example 1000 for 1000kbps: "
read desired
echo "Please enter minimum kbps: "
read minrate
echo "Please enter maximum kbps: "
read maxrate

for i; do
filename=$(basename "$i")
extension="${filename##*.}"
filename="${filename%.*}"
size=k
    d=$(dirname "$i")
#    b=$(basename "$i")
ffmpeg -i "$i" -c:v hevc_nvenc -preset medium -crf 28 -b:v $desired$size -minrate $minrate$size -maxrate $maxrate$size -bufsize 25M -c:a copy "$d/X265_$filename.mp4"
mv "$i" "$d/zzz_$filename.$extension"
done

将此查找命令与 xargs 一起使用:

find ./ -type f -regex ".*\.\(mkv\|mp4\|wmv\|flv\|webm\|mov\|avi\)" -print0 | xargs -0 /root/batch.sh

我希望它提示我一次询问比特率变量,但在使用 find 命令时它不会暂停以获取信息,但如果我直接 运行 脚本它会暂停。

有没有办法将 find 命令合并到其他脚本中,使其成为一个简单的命令,然后提示我输入信息?如果没有,我该怎么做才能让它提示我?

问题是 shell 脚本从 xargs 继承了它的标准输入,而它的输入是来自 find 的管道。所以脚本正在尝试从该管道读取。

如果您可以修改脚本,请将其更改为从 /dev/tty 而不是标准输入读取输入。把它放在脚本的开头:

exec </dev/tty

您可以使用 -exec ... + 选项完全省略 xargs 部分 到 find 命令。

我这里有一个类似于您的脚本

$ cat test.sh
#!/bin/sh
read a
for i ; do echo -n $i.$a' ' ; done
echo
$

一个包含几个文件的目录(注意文件名包含空格)

$ ls -1 one
1 1
2 1
3 1
4 1
$

以及最终将 find-exec ... + 一起使用的示例 选项

$ find  one -type f -exec sh test.sh '{}' '+'
asdef
one/2 1.asdef one/3 1.asdef one/1 1.asdef one/4 1.asdef 
$

PS 我编辑了我的答案以反映 OP 对带空格的文件名等的关注...幸运的是 find 自己处理问题,w/o 任何问题。