在bash脚本循环上请求输入

时间:2018-11-19 14:15:23

标签: bash jpegoptim

我正在尝试对图片运行jpegoptim,并在循环中的某个时刻...让我们说了200次迭代之后,我得到了“ stdin”,这需要进一步输入。

有没有办法强制输入?

#!/bin/bash
for i in `find . -name "*.jpg" -type f`; do
  jpegoptim "$i" >> jpg.log; done
done

2 个答案:

答案 0 :(得分:2)

您可以使用计数器,然后在计数器达到200时使用BindingContext = this;要求用户输入

read

答案 1 :(得分:1)

首先,不要在for循环中处理动态生成的文件列表。

第二,您的代码已损坏-您有2个done

第三,我很抱歉,对这个工具不熟悉,但是我倾向于认为您的问题在代码中比所介绍的更广泛。

第四,(变得轻微而挑剔:)比起反引号更喜欢$( ... )。很少有理由不使用bash。

不过,除了第三件事之外,几乎所有这些都与您的问题无关……看看是否有帮助-

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
  

更新

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 ...