많은 파일을 실행하기 위해 루프를 수행하는 방법

많은 파일을 실행하기 위해 루프를 수행하는 방법

하나의 파일에 대해 이와 같이 작동하는 스크립트가 있습니다.

./script 0001g.log > output

다음과 같이 두 개 이상의 파일에 대해

./script 0001g.log 0002g.log 0003g.log > output

스크립트는 각 입력 파일에서 하나의 특수 번호를 가져와 하나의 출력 파일에 넣습니다.

내 질문은 1000개의 입력 파일이 있다는 것입니다. 스크립트를 실행하기 위해 루프를 어떻게 수행할 수 있습니까?

답변1

몇 가지 가능한 해결책이 있습니다.

간단히

$ ./script *g.log >output

... 그리고 *g.log명령줄이 너무 길어지는 문제로 확장되지 않기를 바랍니다. 이것은 그다지 강력하지 않습니다.

스크립트가 제공된 파일 수에 의존하지 않는 경우, 즉 output각 입력 파일에 대해 출력을 추가할 수 있는 경우 다음은 또 다른 해결책입니다.

$ find ./ -type f -name "*g.log" | xargs ./script >output

세 번째 해결책은 루프를 스크립트 자체로 옮기는 것입니다.

for f in *g.log; do
  # old code using "$f" as file name
done

이는 스크립트에 있으므로 명령줄 길이 제한 문제가 없습니다.

이제 스크립트 호출은 다음과 같습니다.

$ ./script >output

답변2

만약에

./script 0001g.log 0002g.log 0003g.log > output

방정식.

./script 0001g.log > output
./script 0002g.log >> output
./script 0003g.log >> output

그런 다음 루프를 사용하거나

`seq -f '%04gg.log' 10` | script > output

답변3

원한다면 파일을 디렉토리에 넣을 수 있습니다

/opt/location/source
    /0001g.log
    /0002g.log
    /0003g.log

그런 다음 bash 스크립트에서 다음을 시도해 볼 수 있습니다

#!/bin/bash

# store path to files
SOURCE="/opt/location/source/"

# loop through files
for FILE in `ls $SOURCE*g.log`; do
    # do what you want to specific file
    echo $FILE
done

관련 정보