두 파일을 동적으로 연결하고 결과를 새 파일로 참조하는 방법은 무엇입니까?

두 파일을 동적으로 연결하고 결과를 새 파일로 참조하는 방법은 무엇입니까?

staticEntries.dic과 DynamicEntries.dic라는 두 파일을 연결하고 싶습니다. 이름에서 알 수 있듯이 staticEntries.dic의 내용은 시간이 지나도 동일하게 유지되지만(일반적인 단어 포함), 반대로 DynamicEntries.dic은 시간이 지나면 변경될 수 있습니다(데이터베이스에서 추출된 약어 포함). 내 편집기에서 이 두 파일의 내용이 포함된 mydict.dic을 제공하고 싶습니다. 물론 셸을 통해 이 작업을 수행할 수 있지만 그런 다음 생성된 mydict.dic에 새 버전의 DynamicEntries.dic를 연결하려면 먼저 mydict.dic 파일의 DynamicEntries.dic 콘텐츠를 바꿔야 합니다. -> 다른 두 파일을 연결하는 명령으로 mydict.dic 파일을 생성하고 싶은데 어떻게 해야 할지 모르겠습니다. 내 편집자가 실행하거나 호출하지 않았기 때문에(아마도) bash 명령을 사용할 수 없습니다.

다음은 간단한 예입니다.

staticEntries.dic의 내용

house
dog
horse

DynamicEntries.dic의 내용. 이 콘텐츠는 데이터베이스에서 생성되므로 시간이 지남에 따라 변경될 수 있습니다.

EGB38
PD
UH7ZT

mydict.dic의 추적 콘텐츠

house
dog
horse
EGB38
PD
UH7ZT

쉘을 통해 해당 조합을 수행하는 경우, 새 버전의 동적Entries.dic 파일이 생성되면 문제가 발생합니다. mydict.dic 파일에서 중복된 항목을 어떻게 방지할 수 있습니까? 그래서 연결된 명령을 파일에 넣고 이를 사전 파일로 편집기에 제공할 수 있는 일반 파일로 참조하고 싶습니다. 이것이 가능한지 아니면 다른 접근 방식을 취해야 하는지 모르겠습니다.

답변1

명명된 파이프 뒤에 있는 스크립트를 작성하고 열고 읽을 때 staticEntries.dic 및 DynamicEntries.dic의 내용을 덤프할 수 있습니다. 파이프는 닫히고 다시 열릴 때까지 출력을 종료합니다.

하지만 스크립트를 백그라운드에서 실행 중인 상태로 두어야 하며 로그아웃/로그인 또는 재부팅 후에 다시 시작해야 합니다.

더 중요한 것은 이것이 쉘 프로그래밍 초보자를 위한 작업이 아니라는 것입니다.

때로는 (보통) 가장 간단한 솔루션이 가장 좋습니다.

더 간단한 접근 방식은 mydict.dic을 다른 두 파일에 종속적으로 정의하는 Makefile을 만들고 필요할 때 make를 실행하여 업데이트하는 것입니다. 또는 그냥 쉘 스크립트 - Makefile의 장점은 cron에서 실행할 수도 있고 소스 파일 중 하나가 변경되면 대상 파일(mydict.dic)만 업데이트한다는 것입니다.

예를 들어:

#!/usr/bin/make -f

all: mydict.dic

mydict.dic: staticEntries.dic dynamicEntries.dic
        cat staticEntries.dic dynamicEntries.dic > mydict.dic.tmp
        mv mydict.dic.tmp mydict.dic

줄은 공백이 아닌 탭으로 cat시작됩니다 .mv

연결된 파일은 먼저 임시 파일로 생성된 다음 제자리로 이동되므로 이전 파일을 새 파일로 바꾸는 것은 원자성 작업입니다. 아이디어는 파일을 사용할 때마다 완전한 이전 버전이나 완전한 새 버전을 갖게 되지만 새 버전의 부분 버전은 결코 가지지 않는다는 것입니다.

소스 .dic 파일이 다른 디렉토리에 있는 경우 파일의 전체 경로 이름을 지정해야 합니다.

답변2

동적 사전이 수정된 경우 작은 cronjob을 실행하여 파일을 다시 연결합니다. 먼저 파일의 변경 사항을 감시하는 작은 스크립트를 작성합니다.

#!/usr/bin/env bash
while true; do
  inotifywait -e modify path/to/dynamicEntries.dic
  sort path/to/dynamicEntries.dic /path/to/staticEntries.dic | 
    uniq > mydict.dic.tmp
  sleep 1
done

이제 스크립트를 dict.sh실행 가능하게 만드는 다른 이름 으로 저장 (chmod a+x dict.sh하고 재부팅 시 스크립트를 시작하는 crontab을 만듭니다. 다음 줄을 실행 crontab -e하고 붙여넣으세요.

@reboot /path/to/dict.sh

이제 동적 사전이 변경될 때마다 수동으로 실행할 필요 없이 사전이 자동으로 업데이트됩니다.

답변3

셸에서 파일을 연결하는 것은 간단합니다.

cat staticEntries.dic dynamicEntries.dic

그러면 두 파일의 내용이 모두 인쇄됩니다 stdout. 결과를 새 파일로 리디렉션하려면 다음을 수행하십시오.

cat staticEntries.dic dynamicEntries.dic > mydict.dic

하지만 어쩌면 그것은 당신이 찾고 있는 것이 아닐 수도 있습니다...? 나는 당신이 해결하려는 문제를 잘 이해하지 못한다고 말하고 싶습니다.

답변4

편집자에게 말하는 방법을 변경할 수 있습니다. 를 사용한다고 가정하면 vi쉘 스크립트를 작성할 수 있습니다 editmydictionary.sh.

cat staticEntries.dic dynamicEntries.dic > mydict.dic.tmp
vi mydict.dic.tmp

따라서 를 실행할 때마다 editmydictionary.sh두 파일의 최신 버전을 편집하게 됩니다.

관련 정보