파일 출력을 동적으로 추가

파일 출력을 동적으로 추가

여러 파일의 내용을 결합된 파일에 추가하려고 합니다. 이제 나는 이것을 하고 있다:

cat file1 >> file2 >> file3 >> combined

잘 작동하지만 문제는 디렉터리의 모든 파일에 대해 이 동작을 동적으로 복제하고 싶다는 것입니다. 나는 다음과 같은 접근 방식을 시도했습니다.

for f in *; do
  cat "$f" >> combined
done

하지만 예상대로 작동하지 않는 것 같습니다.

답변1

거기에 있는 루프는 다음과 같습니다.

for f in *; do
  cat "$f" >> combined
done

파일이 combined미리 존재하지 않으면 괜찮으므로 에서 생성된 목록에 포함되지 않습니다 *(또한 파일 이름이 로 시작하지 않는다고 가정합니다 -).

존재하는 경우 루프는 결국 실행되어 cat combined >> combined시스템 공간이 부족하거나 프로그램이 중단될 때까지 파일 내용을 동일한 파일에 추가합니다. GNU 버전의 cat을 실행하지 않으면 오류가 발생합니다."cat:combination: 입력 파일이 출력 파일입니다.".

$f이를 방지하려면 다음과 같이 명시적으로 확인할 수 있습니다 combined.

for f in *; do
    if [ "$f" != combined ]; then
        cat < "$f" >> combined
    fi
done

combined또는 제외된(Bash에서) glob 패턴을 사용하세요.

shopt -s extglob
for f in !(combined); do
  cat < "$f" >> combined
done

cat이 경우 루프를 포기하고 모든 파일 이름 목록을 한 번에 제공하는 것이 더 좋습니다 .

cat ./!(combined) >> combined

( !(combined)ksh(이 구문의 소스)에서도 작동해야 합니다. zsh에서 해당 구문은 set -o extendedglob; cat ./^combined >> combinedksh 구문보다 우수하며 나중에 지원될 예정입니다 set -o kshglob.)

관련 정보