在 bash 脚本循环中请求输入
Request for input on bash script loop
我正在尝试 运行 对图片进行 jpegoptim,并在循环中的某个时刻...假设经过 200 次迭代后,我得到 "stdin",这需要进一步输入。
有没有办法强制输入?
#!/bin/bash
for i in `find . -name "*.jpg" -type f`; do
jpegoptim "$i" >> jpg.log; done
done
您可以使用计数器,然后在计数器达到 200
时使用 read
请求用户输入
#!/bin/bash
count=0
for i in `find . -name "*.jpg" -type f`; do
jpegoptim "$i" >> jpg.log
[[ $((count++)) == 200 ]] && read -rp "Continue? [y/n] " resume
[[ "$resume" == 'n' ]] && break
done
首先,不要在 for
循环中处理动态生成的文件列表。
其次,您的代码已损坏 - 您有 2 个 done
。
第三,很抱歉,我不熟悉该工具,但我倾向于认为您的问题出在比所提供的更广泛的代码中。
第四,(变得小而挑剔 :) 更喜欢 $(
...)
而不是反引号。在 bash.
中很少有不这样做的理由
不过,几乎 none 与您的问题相关,除了可能的第三件事...看看这是否有帮助 -
find . -name "*.jpg" -type f |
while read -r file; do jpegoptim "$file"; done >> jpg.log 2>&1
或者可能更好,
find . -name "*.jpg" -type f | xargs jpegoptim >> jpg.log 2>&1
Update
Benjamin W. 指出当文件名嵌入换行符时这些中断,这是完全正确的。我认为带有嵌入式换行符的文件名是最高级别的令人发指的异端邪说,但有时你无法控制它,所以根据他完全有效的建议:
find . -name "*.jpg" -type f |
while read -r -d '' file; do jpegoptim "$file"; done >> jpg.log 2>&1
或
find . -name "*.jpg" -type f -print0 | xargs -0 jpegoptim >> jpg.log 2>&1
或者最好,为了简单和(因此)安全
find . -name "*.jpg" -type f -exec jpegoptim {} \; >> jpg.log 2>&1
(请检查我的语法...)
虽然如果您正在处理大量文件,仍然存在效率方面的考虑。还应该考虑目标程序可能会或可能不会多处理命令行参数的可能性。考虑它们之间的区别:
$: find /tmp -type f -exec echo {} \;
/tmp/.mintty-version
/tmp/AdobeARM.log
/tmp/foo
. . .
$: find /tmp -type f | xargs echo
/tmp/.mintty-version /tmp/AdobeARM.log /tmp/foo ...
我正在尝试 运行 对图片进行 jpegoptim,并在循环中的某个时刻...假设经过 200 次迭代后,我得到 "stdin",这需要进一步输入。
有没有办法强制输入?
#!/bin/bash
for i in `find . -name "*.jpg" -type f`; do
jpegoptim "$i" >> jpg.log; done
done
您可以使用计数器,然后在计数器达到 200
时使用read
请求用户输入
#!/bin/bash
count=0
for i in `find . -name "*.jpg" -type f`; do
jpegoptim "$i" >> jpg.log
[[ $((count++)) == 200 ]] && read -rp "Continue? [y/n] " resume
[[ "$resume" == 'n' ]] && break
done
首先,不要在 for
循环中处理动态生成的文件列表。
其次,您的代码已损坏 - 您有 2 个 done
。
第三,很抱歉,我不熟悉该工具,但我倾向于认为您的问题出在比所提供的更广泛的代码中。
第四,(变得小而挑剔 :) 更喜欢 $(
...)
而不是反引号。在 bash.
不过,几乎 none 与您的问题相关,除了可能的第三件事...看看这是否有帮助 -
find . -name "*.jpg" -type f |
while read -r file; do jpegoptim "$file"; done >> jpg.log 2>&1
或者可能更好,
find . -name "*.jpg" -type f | xargs jpegoptim >> jpg.log 2>&1
Update
Benjamin W. 指出当文件名嵌入换行符时这些中断,这是完全正确的。我认为带有嵌入式换行符的文件名是最高级别的令人发指的异端邪说,但有时你无法控制它,所以根据他完全有效的建议:
find . -name "*.jpg" -type f |
while read -r -d '' file; do jpegoptim "$file"; done >> jpg.log 2>&1
或
find . -name "*.jpg" -type f -print0 | xargs -0 jpegoptim >> jpg.log 2>&1
或者最好,为了简单和(因此)安全
find . -name "*.jpg" -type f -exec jpegoptim {} \; >> jpg.log 2>&1
(请检查我的语法...)
虽然如果您正在处理大量文件,仍然存在效率方面的考虑。还应该考虑目标程序可能会或可能不会多处理命令行参数的可能性。考虑它们之间的区别:
$: find /tmp -type f -exec echo {} \;
/tmp/.mintty-version
/tmp/AdobeARM.log
/tmp/foo
. . .
$: find /tmp -type f | xargs echo
/tmp/.mintty-version /tmp/AdobeARM.log /tmp/foo ...