여러 하위 폴더에 있는 동일한 이름의 파일 병합

여러 하위 폴더에 있는 동일한 이름의 파일 병합

많은 파일이 포함된 여러 폴더가 있고 각 폴더에는 동일한 이름의 txt 파일이 있으며 동일한 이름의 파일을 하나의 txt 파일로 병합하고 싶습니다.

예:

folder/
     -sub1
     -sub2
     -sub3
      .
      .
      .
     -sub28

각 하위 폴더에는 여러 파일이 있습니다.

EAF001.ID001.txt  EAF001.ID002.txt  EAF001.ID003.txt  EAF001.ID004.txt
EAF001.ID005.txt  EAF001.ID006.txt  EAF001.ID007.txt  EAF001.ID008.txt
EAF001.ID009.txt  EAF001.ID010.txt  EAF001.ID011.txt  EAF001.ID012.txt
EAF001.ID013.txt  EAF001.ID014.txt  EAF001.ID015.txt  EAF001.ID016.txt

같은 이름의 파일을 병합하고 싶습니다.

EAF001.ID001.merge.txt  EAF001.ID002.merge.txt  EAF001.ID003.merge.txt  EAF001.ID004.merge.txt
EAF001.ID005.merge.txt  EAF001.ID006.merge.txt  EAF001.ID007.merge.txt  EAF001.ID008.merge.txt
EAF001.ID009.merge.txt  EAF001.ID010.merge.txt  EAF001.ID011.merge.txt  EAF001.ID012.merge.txt
EAF001.ID013.merge.txt  EAF001.ID014.merge.txt  EAF001.ID015.merge.txt  EAF001.ID016.merge.txt

어떤 도움이라도 대단히 감사하겠습니다.

답변1

export dir='/path/to/folder'

find "$dir" -mindepth 2 -type f -name 'EAF*.txt' \
  -exec sh -c 'for f; do
                 bn=$(basename "$f" .txt);
                 cat "$f" >> "$dir/$bn.merged.txt";
               done' sh {} +

-mindepth 2옵션은 /path/to/folder 디렉터리 자체의 파일을 처리에서 제외하므로(즉, 하위 디렉터리의 파일만 검색) 출력 파일이 이미 존재하는 경우 출력 파일을 자체에 연결하지 않습니다.

중복된 파일 이름이 있는지 여부에 관계없이 "merged.txt" 출력 파일에 파일이 추가됩니다.

중복된 파일 이름만 병합하려는 경우:

typeset -Ax counts # declare $counts to be an exported associative array
export dir='/path/to/folder'

# find out how many there are of each filename
while read -d '' -r f; do
  let counts[$f]++;
done < <(find "$dir" -mindepth 2 -type f -name 'EAF*.txt' -print0)

# concatenate only the duplicates
find "$dir" -mindepth 2 -type f -name 'EAF*.txt' \
  -exec bash -c 'for f; do
                   if [ "${counts[$f]}" -gt 1 ]; then
                     bn=$(basename "$f" .txt);
                     cat "$f" >> "$dir/$bn.merged.txt";
                   fi
                 done' sh {} +

이를 위해서는 bash연관 배열을 지원하는 다른 쉘(예: POSIX 아님 sh)이 필요합니다.

답변2

findtxt 파일을 반복하여 중복된 이름을 사용하고 계산할 수 있습니다 wc. 중복된 이름의 수가 1보다 크면 merge.txt 파일에 추가됩니다.

#!/bin/bash

output_dir="output"
rm -rf "$output_dir"
mkdir "$output_dir"

for file in */*.txt; do
  file_name=$(basename "$file" .txt)
  duplicate_names_count=$(find . -type f -name "$file_name.txt" |  wc -l)
  if [ "$duplicate_names_count" -gt 1 ]; then
    cat "$file" >> "$output_dir/${file_name}.merge.txt"
  fi
done

관련 정보