일부 파일을 검색하는 스크립트가 있는데 그 중 일부에는 공백이 있으므로 를 사용하고 있습니다 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
다음을 수행할 수 있습니다(GNU grep
또는 호환 가능하다고 가정).
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 {} +