여러 파일의 내용을 결합된 파일에 추가하려고 합니다. 이제 나는 이것을 하고 있다:
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 >> combined
ksh 구문보다 우수하며 나중에 지원될 예정입니다 set -o kshglob
.)