簡體   English   中英

在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循環中處理動態生成的文件列表。

其次,您的代碼已損壞-您done 2次。

第三,我很抱歉,不熟悉該工具,但我傾向於認為您的問題在代碼所涵蓋的范圍之外。

第四,(變得輕微而挑剔:)比起反引號更喜歡$( ... ) 很少有理由不這樣做。

不過,除了第三件事之外,幾乎所有這些都與您的問題無關...看看是否有幫助-

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM