0

我正在尝试针对图片运行 jpegoptim,并且在循环中的某个时刻……假设 200 次迭代后,我得到“stdin”,这需要输入才能走得更远。

有没有办法强制输入?

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

2 回答 2

2

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

#!/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
于 2018-11-19T14:35:49.557 回答
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 ...
于 2018-11-19T14:38:10.803 回答