一部のファイルを検索するスクリプトがあり、その一部には空白があるため、を使用していますwhile read
。このようなループ内で各対話型キーを押すのを待つには、read -p "Pause"を使用する必要があります。しかし、キーを押すのを待つのではなく、パイプの最初の文字を読みます。次のようなものが必要です。
find . -name "*.o3g" | grep "pattern" | while read line
do
process "$line"
read -p "Press any key to continue"
done
答え1
すでに特定のコードを使用しているので、bash
次のことができます(GNUgrep
または互換性があると仮定)。
find . -name '*.o3g' -print0 | grep -z pattern |
while IFS= read -rd '' file; do
process "$file"
read -n1 -p 'Press any key to continue' < /dev/tty
done
(ここでは文字(ただし、いくつかのキーは複数の文字を送信します)は制御端末から読み取られます。
あるいは、より良い方法は、次にprocess
stdinがパイプされるのを防ぐためですgrep
。
while IFS= read -u 3 -rd '' file; do
process "$file"
read -n1 -p 'Press any key to continue'
done 3< <(find . -name '*.o3g' -print0 | grep -z pattern)
(修正されていない標準入力から文字を読み取る場合)
また、見ることができます検索結果を繰り返すのはなぜ悪い習慣ですか?find
出力処理方法には他の潜在的な問題があります。
ここで簡単にこれを行うことができます:
find . -name '*.o3g' -path '*pattern*' -ok process {} \;
bash
また、それ自体を除くGNU注意を避けてください。
find . -name '*.o3g' -exec bash -c '
for file do
[[ $file =~ pattern ]] || continue
process "$file"
read -n1 -p "Press any key to continue"
done' bash {} +