그래서 수천 개의 하위 디렉터리가 있는 파일 시스템이 있습니다.
304880.US
906T89.DE
032848.UK
023455.UKREGRESS
:
폴더 내에 1
, 및 이라는 이름의 다른 2
폴더가 있는 경우도 있습니다 3
.
각 최종 디렉토리에는 다양한 텍스트 파일이 포함되어 있습니다 output.txt
.
.UK
이름의 모든 디렉토리를 찾아 output.txt
모든 파일을 하나의 마스터 파일로 병합하고 싶습니다. 순서는 중요하지 않습니다.
예:
├── 032848.UK
│ ├── corrupted.txt
│ ├── errors.txt
│ ├── notfound.txt
│ ├── output.txt
│ └── rejected.txt
├── 135411.UK
│ ├── 1
│ │ ├── corrupted.txt
│ │ ├── errors.txt
│ │ ├── notfound.txt
│ │ ├── output.txt
│ │ └── rejected.txt
│ ├── 2
│ │ ├── corrupted.txt
│ │ ├── errors.txt
│ │ ├── notfound.txt
│ │ ├── output.txt
│ │ └── rejected.txt
│ └── 3
│ ├── corrupted.txt
│ ├── errors.txt
│ ├── notfound.txt
│ ├── output.txt
│ └── rejected.txt
├── 304880.US
│ ├── corrupted.txt
│ ├── errors.txt
│ ├── notfound.txt
│ ├── output.txt
│ └── rejected.txt
├── 906T89.DE
│ ├── corrupted.txt
: :
└── ...
답변1
(f는 병합이 연결되어 있다고 가정합니다.)
연결하다
다음과 같이 할 수 있습니다 (찾다):
find . -wholename '*.UK*/*output.txt' -exec cat {} >>concatenated.UK.txt +
또는 전역 위치 지정을 통해:
cat *.UK*/*{output.txt,/output.txt} >concatenated.UK.txt
또는 더 구체적으로:
cat *.UK*/{output.txt,[123]/output.txt} >concatenated.UK.txt
목록
find의 경우 다음을 통해 찾은 내용을 확인할 수 있습니다.
find . -wholename '*.UK*/*output.txt'
글로벌 예의 경우:
printf '%s\n' *.UK*/{output.txt,[123]/output.txt}
답변2
조건부부터 시작하겠습니다. 병합은 연결을 의미합니다. 생성된 파일은 다음 디렉토리에 배치되어야 합니다 *.UK/
.
find -path '*.UK/[123]/output.txt' -exec bash -c 'cat $0 >>${0%/*}/../output.txt' {} \;
다음과 같은 경로를 추가할 수 있지만
\( -path '*.UK/[123]/output.txt' -o -path '*.UKREGRESS/[123]/output.txt' \)
생성된 파일은 자체 상위 디렉터리에 개별적으로 배치됩니다.