모든 하위 디렉터리에서 동일한 이름을 가진 txt 파일을 병합하는 방법

모든 하위 디렉터리에서 동일한 이름을 가진 txt 파일을 병합하는 방법

많은 파일이 포함된 폴더가 있고 각 폴더에는 동일한 이름의 txt 파일이 있으며 모든 하위 디렉터리의 모든 txt 파일을 하나의 폴더로 병합하고 싶습니다.

예:

/home/parent/Folder1 ===> txtfile1.txt, txtfile2.txt, txtfile3.txt
/home/parent/Folder2 ===> txtfile1.txt, txtfile2.txt, txtfile3.txt
/home/parent/Folder3 ===> txtfile1.txt, txtfile2.txt, txtfile3.txt

같은 이름을 가진 모든 파일을 다른 폴더에 병합하고 싶습니다.

/home/parent/Merged ===> txtfile1.txt, txtfile2.txt, txtfile3.txt

답변1

다음을 사용할 수 있습니다.

mkdir "/home/parent/MERGED"
find "/home/parent/Folder1" -type f -name '*txt' -printf '%f\0' | 
xargs -0 -I FILENAME find "/home/parent" ! -path '/home/parent/MERGED/*' \
-type f -name FILENAME\
-exec sh -c 'cat "$1" >> "/home/parent/MERGED/$2"' sh {} FILENAME \;

할 수 있는 작업:

  • 대상 디렉터리 생성
  • FOLDER1을 스캔하고 파일 이름(경로 없이)을 인쇄한 다음 NUL을 구분 기호로 사용합니다.
  • 이 목록을 읽어보세요xargs
  • find각 입력 이름에 대해 한 번 실행하고 parent해당 이름을 가진 파일을 검색합니다.
  • 이 검색에서 대상 디렉터리 제외
  • 결과를 MERGED에 지정된 이름의 파일로 연결합니다.

참고: 출력 파일의 데이터는 반드시 FOLDER1, FOLDER2 등의 이름으로 정렬되는 것이 아니라 find파일을 검색한 방식으로 정렬됩니다.

참고 2: 병합 디렉터리를 올바르게 필터링하려면 절대 경로가 필요합니다.

답변2

그리고 zsh:

cd /home/parent && mkdir -p Merged || exit
typeset -A files
for file (Folder*/*.txt(nN)) files[$file:t]+=$file$'\0'
for file (${(k)files}) cat -- ${(0)files[$file]} > Merged/$file

숫자 순서 는 다음 n과 같이 glob 확장의 glob 한정자에 적용됩니다.Folder2앞으로 Folder10그리고 txtfile1.txt이전 txtfile10.txt예입니다.

숨겨진 파일은 건너뜁니다. 이들을 병합하려면 Dglob 한정자를 추가하세요.

관련 정보