使用Xargs提示的Bash脚本?

时间:2016-11-09 21:14:39

标签: bash 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命令合并到另一个脚本中,使其成为一个简单的命令,然后提示我输入信息?如果没有,我该怎么做才能让它提示我?

2 个答案:

答案 0 :(得分:3)

问题是shell脚本从xargs继承了它的标准输入,它的输入是来自find的管道。所以脚本试图从那个管道中读取。

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

exec </dev/tty

答案 1 :(得分:3)

您可以使用xargs选项完全省略-exec ... +部分 到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可以自行处理问题,没有任何问题。