디렉터리(특정 파일 .biz)에 5~6개의 파일이 있고 이를 한 번에 하나씩 변수 $file에 저장하고 디렉터리에서 더 이상 .biz 파일을 찾을 수 없을 때까지 일련의 명령을 적용하려는 경우 어떻게 해야 합니까? 관리하다.
나는 사용하려고
for f in graham/quant
do
if grep "max" $file;
then
maximum.sh $file
elif grep "milan" $file;
then
milan.sh $file
elif grep "min" $file;
then
minimum.sh $file
.
.
.
else
echo " keep working you are close "
fi
done
그러나 프로그램은 첫 번째 유효한 조건을 가진 모든 파일을 실행합니다.
확장자가 .biz인 파일이 5개 있는 경우 모든 파일은 첫 번째 유효한 조건으로 5번 실행됩니다.
출력은 다음과 같습니다:
Milan
Milan
Milan
Milan
Milan
바꾸다
Milan
Minimum
Maximum
.
.
어떤 아이디어가 있나요?
답변1
grep -lZ max graham/quant/*.biz | xargs -0r maximum.sh
grep -lZ milan graham/quant/*.biz | xargs -0r milan.sh
grep -lZ min graham/quant/*.biz | xargs -0r minimum.sh
grep
참고: 선택적으로 NUL로 구분된 파일 이름을 출력 하려면 GNU가 필요합니다 -Z
.
이 줄에서는 원하는 패턴( , 또는 )이 포함된 파일 목록을 출력하는 grep
옵션 과 파일 이름을 구분하기 위해 NUL을 사용하는 옵션을 사용합니다.-l
max
milan
min
-Z
어느유효한 문자).
xargs
이는 일치하는 각 파일에 대해 적절한 스크립트가 실행되도록 파이프로 연결됩니다 .
이러한 스크립트는 명령줄에서 여러 파일 이름 인수를 올바르게 처리한다고 가정합니다. 없으면 옵션 -n 1
에 추가하세요.xargs
예를 들어grep -lZ max graham/quant/*.biz | xargs -0r -n 1 maximum.sh
에서 man grep
:
-l
,--files-with-matches
일반 출력을 억제합니다. 대신 print는 일반적으로 각 입력 파일의 이름을 인쇄합니다. 검색은 첫 번째 일치에서 중지됩니다.
그리고:
-Z
,--null
일반적으로 파일 이름 뒤에 오는 문자 대신 0바이트(ASCII NUL 문자)를 출력합니다. 예를 들어,
grep -lZ
일반적인 개행 대신 각 파일 이름 뒤에 0바이트를 출력합니다.이 옵션을 사용하면 파일 이름에 개행과 같은 특이한 문자가 포함된 경우에도 출력이 명확해집니다.
find -print0
이 옵션은 ,perl -0
, 및sort -z
등의 명령과 함께 사용하여xargs -0
임의의 파일 이름(개행 문자가 포함된 이름도 포함)을 처리할 수 있습니다.
답변2
사용자가 말했듯이 사용 중입니다.고대 유닉스 쉘, 다른 버전의 스크립트를 사용해 보겠습니다.
#!/bin/sh
#test version for ancient shell.
cd graham/quant
for file in *.biz
do
grep -q "max" "$file"
if [ "$?" = "0" ]; then
maximum.sh "$file"
fi
grep -q "milan" "$file"
if [ "$?" = "0" ]; then
milan.sh "$file"
fi
grep -q "min" "$file"
if [ "$?" = "0" ]; then
minimum.sh "$file"
fi
done
cd $OLDPWD