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 任何问题。
我有一个正在尝试的脚本 运行:
#!/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 任何问题。